It depends on the role the classes play in the application. If class is a value where identification does not matter, you must prohibit copy and assignment. Similarly, if the class is polymorphic. As a rule, as a rule, if you select objects of a class type dynamically, it should not be flexible. And vice versa, if you copy a class, you should not select its instances dynamically. (But there are some exceptions, and it is not uncommon to allocate dynamically and avoid copying large objects, even if the semantics say otherwise.)
If you are developing a low-level library, the choice is less clear. Something like std::vector can play a lot of role in the application; in most of them, copying would be inappropriate, but the prohibition of copying would make it unusable in the few where appropriate.
source share