В чем разница между объявлением конструктора копирования с помощью "= default" или его отсутствием вообще?

Я пытаюсь понять поведение автоматически сгенерированного кода компилятора для различных функций, таких как:

  1. деструктор
  2. конструктор копирования
  3. оператор присваивания
  4. переместить конструктор
  5. оператор присваивания перемещения

Будет ли их объявление с помощью "= default" вызывать какие-либо функциональные различия по сравнению с незадекларированным случаем? Отличается ли ответ на этот вопрос среди перечисленных выше функций? Если функциональной разницы нет, каковы последствия использования любого случая?

Конструктор копирования, объявленный с помощью "= default"

class MyClass
{
public:
    MyClass();
    MyClass(MyClass &other) = default;
    
    OtherClass some_member;
};

Конструктор копирования не объявлен:

class MyClass
{
public:
    MyClass();

    OtherClass some_member;
};

1 ответ

Решение

В некоторых случаях конструктор копирования по умолчанию удаляется. Самый простой пример:

class myClass {

public:
    myClass();
    myClass(myClass &&);
};

myClass a;

void func()
{
    myClass b=a;  // ERROR
}

Вместо того, чтобы объяснять причину ошибки компиляции, я просто дословно вставлю ошибку компиляции из моего компилятора:

constexpr myClass::myClass(const myClass&) неявно объявляется как удаленный, потому что myClass объявляет конструктор перемещения или оператор присваивания перемещения

Явное объявление конструктора копирования по умолчанию или определяемого пользователем конструктора копирования приведет к компиляции кода.

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

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