编译器不会定义implicits的条件(构造函数,析构函数,复制构造函数,复制赋值)

时间:2013-03-23 19:00:09

标签: c++ default-constructor implicits

这应该是一个微不足道的问题,但我无法在stackoverflow上明确找到它。

如果用户没有提供,将隐式定义以下内容。

  1. 默认(无参数)构造函数
  2. 复制构造函数
  3. 复制分配操作员
  4. 但是我已经读过某个地方(我现在似乎无法找到),有些情况下编译器不会隐式实现它们。

    这些条件是什么?

1 个答案:

答案 0 :(得分:50)

如果符合以下情况,则不会隐式生成

The Default Constuctor(例如,X()

  • 您已明确声明任何构造函数
  • 有一个不是默认构造的数据成员(例如引用,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(例如,~X()

  • 您已明确声明析构函数
  • (C ++ 11)您明确告诉编译器不使用~X() = delete;
  • 生成一个
如果出现以下情况,则不会隐式生成

The Move Constructor(C ++ 11)(例如,X(X&&))。

  • 您已明确声明移动构造函数(对于类X,构造函数采用X&&
  • 您已声明复制赋值运算符,复制构造函数,析构函数或移动赋值运算符
  • 您的类中有一个数据成员无法移动构造(const,是引用,或者有删除,不可访问或模糊的移动构造函数)
  • 基类不能移动构造
  • 您明确告诉编译器不使用X(X&&) = delete;
  • 生成一个
如果出现以下情况,则不会隐式生成

The Move Assignment Operator(C ++ 11)(例如,X& operator=(X&&))。

  • 您已明确宣布移动分配运算符(对于班级Xoperator=正在考虑X&&
  • 您已声明复制赋值运算符,复制构造函数,析构函数或移动构造函数
  • 您的班级中有一个数据成员无法移动分配(const,是引用,或者已删除,无法访问或模糊的移动分配运算符)
  • 基类不能移动分配
  • 您明确告诉编译器不使用X& operator=(X&&) = delete;
  • 生成一个