В чем разница между объявлением конструктора копирования с помощью "= default" или его отсутствием вообще?
Я пытаюсь понять поведение автоматически сгенерированного кода компилятора для различных функций, таких как:
- деструктор
- конструктор копирования
- оператор присваивания
- переместить конструктор
- оператор присваивания перемещения
Будет ли их объявление с помощью "= 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 объявляет конструктор перемещения или оператор присваивания перемещения
Явное объявление конструктора копирования по умолчанию или определяемого пользователем конструктора копирования приведет к компиляции кода.
Есть еще несколько причин. Явно объявленный конструктор копирования, например, удаляет неявно объявленный конструктор перемещения.