2013-03-23 52 views
26

这应该是一个微不足道的问题,但我不能明确地找到它的计算器。何种条件下,编译器不会定义implicits(构造函数,析构函数,拷贝构造函数,拷贝赋值)

下面将如果不是由用户提供的隐式地定义。

  1. 默认(无参数)构造
  2. 拷贝构造函数
  3. 拷贝赋值运算符
  4. 析构函数

不过我读的地方(我不能似乎现在找到),有编译器不会隐式实现它们的一些条件。

这些是什么条件呢?

回答

44

The Default Constuctor(例如,X())将不会被隐式生成的,如果:

  • 你有明确宣布任何构造都
  • 存在是不是默认-constructible数据成员(如一个参考,一个const对象或一个没有或不可访问的默认构造函数的类)
  • (C++ 11)您明确告诉编译器不要使用X() = delete;

The Copy Constructor(例如,X(const X&))将不会被隐若产生:

  • 你有明确宣布拷贝构造函数(用于X类的构造函数取XX&const X&
  • 有是不拷贝构造(例如,没有或不能访问拷贝构造一个类)
  • 基类不是一个数据成员拷贝构造
  • (C++ 11)你宣布此举构造或移动赋值操作符
  • (C++ 11)你已经明确告诉编译器使用不产生一个X(const X&) = delete;

The Copy Assignment Operator(例如,X& operator=(const X&))将不会被隐若产生:

  • 你有明确宣布一个拷贝赋值运算符(Xoperator=采取XX&const X&)类
  • 存在在类的数据成员不是可复制分配的(例如参考,const对象或没有或不可访问赋值运算符的类)
  • 基类不是可复制赋值的
  • (C++ 11)你有宣布此举构造或移动赋值操作符
  • (C++ 11)你已经明确告诉编译器使用X& operator=(const X&) = delete;

The Destructor不生成一个(例如,

  • 你有明确宣布析构函数
  • (C++ 11)你甲肝:~X())将不会被是否隐式生成Ë明确告诉编译器使用不产生一个~X() = delete;

The Move Constructor(C++ 11)(例如,X(X&&))将不会被隐若产生:

  • 你有明确宣布一招构造函数(对于类X,构造函数采用X&&
  • 您有声明复制赋值运算符,复制构造函数,析构函数或移动赋值ope rator
  • 有在你的类的数据成员,不能移动构造的(是const,是一个参考,或已被删除的,不可访问,或不明确的移动构造函数)
  • 基类不能被移动构造的
  • 你已经明确告诉编译器使用不产生一个X(X&&) = delete;

The Move Assignment Operator(C++ 11)(例如:,X& operator=(X&&))将不会被隐若产生:

  • 你有明确宣布移动赋值运算符(X类,一个operator=采取X&&
  • 你有宣布一个拷贝赋值运算符,复制构造函数,析构函数或移动构造函数
  • 在您的类中存在无法移动分配的数据成员(是const,是引用或具有删除,不可访问或含糊不清的移动赋值运算符)
  • 基类不能布展分配
  • 你已经明确告诉编译器使用X& operator=(X&&) = delete;
+0

那么,在所有这些第二点,它会被隐式定义,就像'delete'不产生一个d。 – 2013-03-23 19:06:55

+1

+1不要忘记C++ 11的新增功能,您可以明确声明它们不应该被创建('A(const A&)= delete;'),为了完整性您应该添加Move构造函数。 – pickypg 2013-03-23 19:10:22

+0

@pickypg:我不确定移动构造函数,如果你将我想要的信息添加到我的答案中,我会很高兴 – 2013-03-23 19:11:29