Согласно приведенной ниже широко известной таблице, автоматическая генерация компилятором конструктора копирования по умолчанию и назначения копирования не рекомендуется в C ++ 11, когда один или несколько из назначения копирования, конструктора копирования и деструктора предоставляются / предоставляются пользователем (красный ячейки указывают на износ). Это имеет смысл в свете «правила 3». Однако таблица показывает, что создание деструктора по умолчанию не считается устаревшим в случае предоставленного пользователем конструктора / назначения копирования.
Что является обоснованием этого дизайнерского решения?
Почему это должно быть устаревшим? Для объекта вполне возможно требовать специальных свойств копирования, но его уничтожение полностью определяется его деструкторами подобъекта. Рассмотрим простой указатель клонирования:
template <class T>
class cloning_ptr
{
std::unique_ptr<T> p;
public:
cloning_ptr(const cloning_ptr &src) : p(std::make_unique<T>(*src.p) {}
cloning_ptr(cloning_ptr &&) = default;
cloning_ptr& operator= (cloning_ptr rhs)
{ swap(p, rhs.p); return *this; }
};
Нет нужды предоставлять деструктор, который делает что-то отличное от дефолтного.
И наоборот: если вам нужно делать особые вещи в dtor, это, вероятно, означает, что в классе смоделировано нестандартное владение. Нестандартное владение, скорее всего, также потребует обработки в операциях копирования.
Других решений пока нет …