У меня проблема с устаревшей версией с момента создания С++ 11 конструктора копирования и оператора присваивания копии, когда есть определяемый пользователем деструктор.
Для большинства достаточно простых классов конструкторы, операторы и деструкторы, созданные по умолчанию, являются точными. Рассмотрим следующие причины для объявления деструктора:
-
Создание тривиального деструктора виртуального в базовом классе:
// header class Base1 { public: virtual ~Base1() = default; }; class Base2 { public: virtual ~Base2(); }; // source Base2::~Base2() = default;
Все ли 4 копии и перемещение специальных методов будут сгенерированы компилятором в этих случаях? Если да, то я думаю, что это нормально, и нет необходимости усложнять
Base1
илиBase2
. -
Печать отладочного сообщения в деструкторе:
// header class D { public: ~D(); }; // source D::~D() { #ifdef DEBUG_THIS std::cout << "D was destructed." << std::endl; #endif }
Я считаю, что в этом случае будет создан экземпляр-конструктор и оператор присваивания; но переместить конструктор и оператор присваивания не будет. Я хочу избежать использования устаревшего генерирования по умолчанию и отключения копирования
D
. Я также хочу избежать наводненияD
объявлениями 4deleted
. Достаточно ли отключить только один конструктор экземпляра? Это хороший стиль?