ИМХО, предоставление конструктора копирования и оператора присваивания или не зависит больше от того, что моделирует ваш класс, чем от стоимости копирования.
Если ваш класс представляет значения , то есть если передача объекта или копии объекта не имеет значения, то предоставьте их (и предоставьте также оператор равенства)
Если вашего класса нет, то есть если вы думаете, что у объекта этого класса есть идентичность и состояние (также говорят о сущностях ), не делайте этого. Если копия имеет смысл, предоставьте ей клона или члена копии.
Иногда есть классы, которые вы не можете легко классифицировать. Контейнеры находятся в этом положении. Это означает, что следует рассматривать их как объекты и передавать их только по ссылке и выполнять специальные операции для создания копии при необходимости. Вы также можете рассматривать их просто как совокупность значений, поэтому копирование имеет смысл. STL был разработан вокруг типов значений. И поскольку все является ценностью, для контейнеров имеет смысл быть таковыми. Это позволяет такие вещи, как map<int, list<> >
, которые являются полезными. (Помните, что вы не можете помещать классы без копий в контейнер STL).