Another downside to be aware of though, is when you use a complex constructor (and no default constructor), you're limiting your class from being usable in some places, e.g. std::vector will no longer work (but std::vector will).
That's not true. The only requirement for use in std::vector is that a type is assignable and copyable (and in modern C++, those restrictions are relaxed to simply movable), neither of which requires a default constructor.
Some containers do have member functions that use default-constructed values as default-parameters.
std::vector<MyType> myVector(50), for example. Default-constructs 50 elements. You have to call std::vector<MyType> myVector(50, <some value to copy from>) if you don't have a default constructor.
And if you don't have a default constructor OR a copy-constructor, then you can't call resize() (or the resizing std::vector constructors). In that case, you'll have to just call push_back(std::move(value)) or emplace_back(construction params), probably after calling reserve() first.
Not show-stopping, but something you have to work around. It's not very convenient when some of the convenience functions are unusable.