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