29

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

如果用户未提供以下内容,则将隐含定义。

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

但是我在某处读过(我现在似乎找不到),在某些情况下编译器不会隐式实现它们。

这些条件是什么?

4

1 回答 1

53

默认构造函数(例如,X())将不会在以下情况下隐式生成:

  • 您已经明确声明了任何构造函数
  • 存在不可默认构造的数据成员(例如引用、const对象或没有或不可访问的默认构造函数的类)
  • (C++11) 你已经明确告诉编译器不要使用X() = delete;

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

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

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

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

~X()在以下情况下不会隐式生成析构函数(例如

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

X(X&&)在以下情况下,将不会隐式生成移动构造函数(C++11)(例如

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

X& operator=(X&&)在以下情况下,将不会隐式生成移动赋值运算符(C++11)(例如

  • 您已经明确声明了一个移动赋值运算符(对于 class X,一个operator=taking X&&
  • 您已经声明了复制赋值运算符、复制构造函数、析构函数或移动构造函数
  • 您的班级中有一个数据成员不能被移动分配(是const、是引用,或者有一个已删除、不可访问或不明确的移动分配运算符)
  • 基类不能被移动分配
  • 您已明确告诉编译器不要使用X& operator=(X&&) = delete;
于 2013-03-23T19:04:27.630 回答