1

我试图了解各种功能的自动生成编译器代码的行为,例如:

  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;
};
4

1 回答 1

0

在某些情况下,默认情况下会删除复制构造函数。最简单的例子:

class myClass {

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

myClass a;

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

我不会解释编译错误的原因,而是从我的编译器中逐字粘贴编译错误:

'constexpr myClass::myClass(const myClass&)' 被隐式声明为已删除,因为'myClass' 声明了移动构造函数或移动赋值运算符

显式声明默认或用户定义的复制构造函数将使代码编译。

还有其他几个原因。一个显式声明的复制构造函数会删除隐式声明的移动构造函数,例如。

于 2020-10-24T16:37:59.590 回答