If, on the other hand, you're good to go with just the default implementations of all special member functions, then just don't declare them at all. This is a clear sign that you want the default behavior. It's also the least confusing. Consider the following type:
class PotentiallyMisleading { public: PotentiallyMisleading() = default; PotentiallyMisleading(const PotentiallyMisleading &) = default; PotentiallyMisleading &operator=(const PotentiallyMisleading &) = default; PotentiallyMisleading(PotentiallyMisleading &&) = default; PotentiallyMisleading &operator=(PotentiallyMisleading &&) = default; ~PotentiallyMisleading() = default; private: std::unique_ptr<int> int_; };
Even though we defaulted all the members, the class is still non-copyable. That's because it has a unique_ptr member that is non-copyable itself. Fortunately, Clang will warn you about this, but GCC does not by default...