c++ - 默认定义声明的不完整冗长

标签 c++ c++11

在 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/

相关文章:

c++ - 从外部更改命名空间变量值 (C++)

c++11 - 是否有对应于 std::is_pod<>​​ 的类型谓词的合取?

c++ - 渲染目标 ID2D1Bitmap 错误

c++:如何避免 static_cast?

c++ - 如何从exe文件名中查找窗口句柄

c++ - 删除基类中的复制和移动构造函数/赋值运算符是否足够?

c++ - C++11有规定静态/全局变量的构造顺序吗?

c++ - 如何替换 PostgreSQL 表列中的值?

c++ - 具有模板化参数的 typedef 函数指针

c++ - 'using' 关键字从多个虚拟继承函数中进行选择