Правило 3 Устаревший элемент по умолчанию в C ++ 11

Согласно приведенной ниже широко известной таблице, автоматическая генерация компилятором конструктора копирования по умолчанию и назначения копирования не рекомендуется в C ++ 11, когда один или несколько из назначения копирования, конструктора копирования и деструктора предоставляются / предоставляются пользователем (красный ячейки указывают на износ). Это имеет смысл в свете «правила 3». Однако таблица показывает, что создание деструктора по умолчанию не считается устаревшим в случае предоставленного пользователем конструктора / назначения копирования.

Что является обоснованием этого дизайнерского решения?

Справочная таблица

4

Решение

Почему это должно быть устаревшим? Для объекта вполне возможно требовать специальных свойств копирования, но его уничтожение полностью определяется его деструкторами подобъекта. Рассмотрим простой указатель клонирования:

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, это, вероятно, означает, что в классе смоделировано нестандартное владение. Нестандартное владение, скорее всего, также потребует обработки в операциях копирования.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]