C++: влияет ли конструктор копирования по умолчанию на наличие других конструкторов и деструкторов?
Как известно, Если объявлен какой-либо конструктор (включая конструктор копирования), конструктор по умолчанию (тот, который не принимает аргументов) неявно не создается. То же самое происходит с конструктором копирования по умолчанию (тот, который выполняет мелкую копию объекта)? Кроме того, влияет ли на это присутствие деструктора?
5 ответов
ответы здесь правильные, но не полные. Они верны для C++98 и C++03. В C++11 вы не получите конструктор копирования, если вы объявили конструктор перемещения или перемещения оператора присваивания. Кроме того, если вы объявили оператор присваивания копии или деструктор, неявное создание конструктора копирования устарело. 12.8 [класс.copy]:
Если определение класса не явное объявление конструктора копирования, нет объявленный пользователем ход конструктор, и нет объявленное пользователем назначение перемещения оператор, конструктор копирования неявно объявлен дефолт (8.4.2). Такое имплицитное заявление осуждается, если класс имеет оператор назначения копий, объявленный пользователем или объявленный пользователем деструктор.
12.8 #4 копирование объектов класса
Если определение класса не явное объявление конструктора копирования, один объявляется неявно
и деструктор не играет никакой роли
нет. Вы получите конструктор копирования по умолчанию, если вы не предоставите свой собственный конструктор копирования, и наличие или отсутствие деструктора не имеет значения.
нет. И обратите внимание, что
MyClass
{
template <typename T> MyClass(const T&);
};
не предоставляет конструктор копирования, и создается конструктор по умолчанию.
конструктор копирования по умолчанию всегда создается, если вы не определяете свой собственный. Конструктор без аргументов не определен ни с каким другим конструктором, чтобы избежать его вызова и, следовательно, пропуска кода реального конструктора(ов).