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

aia*_*iao 29 c++ default-constructor implicits

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

如果用户不提供,将隐式定义以下内容.

  1. default(无参数)构造函数
  2. 复制构造函数
  3. 复制赋值运算符
  4. 析构函数

但是我已经读过某个地方(我现在似乎无法找到),有些情况下编译器不会隐式实现它们.

这些条件是什么?

Arm*_*yan 51

X()如果出现以下情况,则不会隐式生成默认构造函数(例如):

  • 你已经显式声明了任何构造函数
  • 有一个不是默认构造的数据成员(例如引用,const对象或没有或无法访问的默认构造函数的类)
  • (C++ 11)你明确告诉编译器不要生成一个使用 X() = delete;

X(const X&)如果出现以下情况,则不会隐式生成复制构造函数(例如):

  • 你已经显式地声明了一个复制构造函数(对于类X构造函数X,X&或者const X&)
  • 有一个不可复制构造的数据成员(例如没有或无法访问复制构造函数的类)
  • 基类不是可复制构造的
  • (C++ 11)你已经声明了一个移动构造函数或移动赋值运算符
  • (C++ 11)你明确告诉编译器不要生成一个使用 X(const X&) = delete;

X& operator=(const X&)如果出现以下情况,则不会隐式生成复制分配运算符(例如):

  • 你已经明确地宣布一个拷贝赋值运算符(类Xoperator=服用X,X&const X&)
  • 您的类中有一个不可复制的数据成员(例如引用,const对象或没有或无法访问赋值运算符的类)
  • 基类不可复制
  • (C++ 11)你已经声明了一个移动构造函数或移动赋值运算符
  • (C++ 11)你明确告诉编译器不要生成一个使用 X& operator=(const X&) = delete;

~X()如果出现以下情况,则不会隐式生成析构函数(例如):

  • 你已经明确声明了一个析构函数
  • (C++ 11)你明确告诉编译器不要生成一个使用 ~X() = delete;

X(X&&)如果出现以下情况,则不会隐式生成 Move Constructor(C++ 11)(例如)

  • 你已经显式声明了一个移动构造函数(对于类X,一个构造函数X&&)
  • 您已声明了复制赋值运算符,复制构造函数,析构函数或移动赋值运算符
  • 您的类中const有一个无法移动构造的数据成员(是,是引用,还是已删除,不可访问或模糊的移动构造函数)
  • 基类不能移动构造
  • 你明确告诉编译器不要生成一个使用 X(X&&) = delete;

X& operator=(X&&)如果出现以下情况,则不会隐式生成移动分配运算符(C++ 11)(例如)

  • 你已经明确地声明了一个移动赋值运算符(对于类X,一个operator=采取X&&)
  • 您已声明了复制赋值运算符,复制构造函数,析构函数或移动构造函数
  • 您的类中有一个数据成员无法移动分配(是const,是引用,还是已删除,不可访问或模糊的移动赋值运算符)
  • 基类不能移动分配
  • 你明确告诉编译器不要生成一个使用 X& operator=(X&&) = delete;