В случае примера ниже Неявно конструктор перемещения и оператор присваивания перемещения не создаются. Я знал.
Итак, сгенерированы ли конструктор копирования и оператор присваивания копирования?
Создан ли неопределенный конструктор копирования неявно?
class X
{
public:
virtual ~X() = default;
}
Ссылки, на которые я ссылался, приведены ниже:
создается ли конструктор копирования?
Копирующий 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]).
Означает ли утверждение, что он больше не используется, то же самое, что и утверждение, что он не создается?
@tuxNeoh Это означает, что копия удалена. Обратите внимание, что удаленные функции по-прежнему участвуют в разрешении перегрузки . Кроме того, вы можете использовать флаг -Wdeprecated-copy-ctor
с gcc, чтобы предупредить вас об этом. Демо
Спасибо за помощь в понимании
@BoP Так будет ли он по-прежнему считаться дефолтным?
Короткий ответ:
=default
Использование деструктора оказывает на них тот же эффект, что и любой другой деструктор, объявленный пользователем (любой деструктор, не сгенерированный компилятором неявно).
Операции перемещения исчезают, а операции копирования остаются на месте, причем последние считаются устаревшими (они тоже должны исчезнуть).