默认定义声明的不完整详细程度

Mus*_*afa 1 c++ c++11

在Stroustrup的C++旅中,他提到:

如果您明确指出某些默认值,则不会生成其他默认定义.

但是,gcc 4.9.1似乎并非如此.举个例子:

#include <iostream>
using namespace std;

struct A 
{
    int data;
    A() = default;
    A(const A&) = default;
};

int main() 
{

  A a;
  a.data = 10;
  A b(a);
  A c;
  c = a;

  cout<<b.data<<endl;
  cout<<c.data<<endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它编译并给出预期的输出.即已生成默认赋值运算符.

我是否误解了Stroustrup的评论?

Mik*_*our 5

首先,您的代码不使用类的赋值运算符,因此它不会证明它存在.但是,添加它的使用

c = a;
Run Code Online (Sandbox Code Playgroud)

会工作,所以问题仍然存在.

声明任何特殊函数不会阻止生成所有其他特殊函数,这似乎就是您解释引用的方式.宣布一些会抑制其他一些人.没有阅读这本书以引用上下文,我不能说它是否具有误导性.

规则大致是:

  • 声明任何构造函数都会阻止隐式默认构造函数;
  • 声明移动构造函数或移动赋值运算符将阻止隐式复制构造函数和复制赋值运算符;
  • 声明析构函数,复制构造函数或复制赋值运算符将阻止隐式移动构造函数和移动赋值运算符;

这是一种简化; 有更多的细微差别和例外.如果您想了解血腥细节,请阅读语言规范.