Если по умолчанию объявлен только виртуальный деструктор, создается ли неявно конструктор копирования?

В случае примера ниже Неявно конструктор перемещения и оператор присваивания перемещения не создаются. Я знал.

Итак, сгенерированы ли конструктор копирования и оператор присваивания копирования?

Создан ли неопределенный конструктор копирования неявно?

class X
{
  public:
    virtual ~X() = default; 
}

Ссылки, на которые я ссылался, приведены ниже:

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

создается ли конструктор копирования?

Копирующий ctor должен быть defaultубран, но теперь он устарел, начиная с class.copy.ctor#6 . Кланг также выдает предупреждение по тому же поводу. Возможно, вы захотите явно указать копирующий фактор по умолчанию, например X(const X&) = default;, чтобы показать намерение и подготовиться к будущему удалению.

Если в определении класса явно не объявлен конструктор копирования, неявно объявляется неявный конструктор. Если в определении класса объявлен конструктор перемещения или оператор присваивания перемещения, неявно объявленный конструктор копирования определяется как удаленный; в противном случае используется значение по умолчанию ([dcl.fct.def]). Последний случай считается устаревшим, если класс имеет объявленный пользователем оператор присваивания копирования или объявленный пользователем деструктор ([depr.impldec]).

(выделено мной)

А поскольку у вас есть деструктор, объявленный пользователем, он устарел.

Аналогично, оператор копирования присваивания для класса, в котором нет ничего, кроме объявленного пользователем dtor, также устарел. Из class.copy.assign#2:

Если в определении класса явно не объявлен оператор присваивания копирования, он объявляется неявно. Если в определении класса объявлен конструктор перемещения или оператор присваивания перемещения, неявно объявленный оператор присваивания копирования определяется как удаленный; в противном случае используется значение по умолчанию ([dcl.fct.def]). Последний случай считается устаревшим, если класс имеет объявленный пользователем конструктор копирования или объявленный пользователем деструктор ([depr.impldec]).

Означает ли утверждение, что он больше не используется, то же самое, что и утверждение, что он не создается?

tux Neoh 05.07.2024 06:23

@tuxNeoh Это означает, что копия удалена. Обратите внимание, что удаленные функции по-прежнему участвуют в разрешении перегрузки . Кроме того, вы можете использовать флаг -Wdeprecated-copy-ctor с gcc, чтобы предупредить вас об этом. Демо

user12002570 05.07.2024 06:53

Спасибо за помощь в понимании

tux Neoh 05.07.2024 07:43

@BoP Так будет ли он по-прежнему считаться дефолтным?

user12002570 05.07.2024 09:41

Короткий ответ:

=default Использование деструктора оказывает на них тот же эффект, что и любой другой деструктор, объявленный пользователем (любой деструктор, не сгенерированный компилятором неявно).

Операции перемещения исчезают, а операции копирования остаются на месте, причем последние считаются устаревшими (они тоже должны исчезнуть).

Другие вопросы по теме