在 Stroustrup 的 Tour of C++ 中他提到:
If you are explicit about some defaults, other default definitions will not be generated.
但是,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;
}
它编译并给出预期的输出。即默认的赋值运算符已经生成。
我是否误解了 Stroustrup 的评论?
最佳答案
首先,您的代码不使用类的赋值运算符,因此它不会证明它存在。但是,添加它的用途
c = a;
会起作用,所以问题仍然存在。
声明任何特殊函数不会阻止生成所有其他特殊函数,这似乎是您解释引用的方式。声明某些会抑制某些其他内容。由于我没有读过这本书,无法将这句话放在上下文中,所以无法判断它是否具有误导性。
规则大致是:
- 声明任何构造函数都会阻止隐式默认构造函数;
- 声明移动构造函数或移动赋值运算符将阻止隐式复制构造函数和复制赋值运算符;
- 声明析构函数、复制构造函数或复制赋值运算符将阻止隐式移动构造函数和移动赋值运算符;
这是一种简化;还有更多细微差别和异常(exception)情况。如果您想要详细信息,请阅读语言规范。
关于c++ - 默认定义声明的不完整冗长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448251/