自动生成默认/复制/移动ctor和复制/移动赋值运算符的条件?

我想在编译器通常自动生成默认构造函数,复制构造函数和赋值运算符的条件下刷新我的记忆。

我似乎记得有一些规则,但我不记得,也无法在网上找到有信誉的资源。 谁能帮忙?

在下文中,“自动生成”意味着“隐式声明为默认,但不定义为删除”。 有些情况下特殊成员函数被声明,但被定义为被删除。

  • 如果没有用户声明的构造函数(§12.1/ 5),则默认构造函数是自动生成的。
  • 如果没有用户声明的移动构造函数或移动赋值操作符(因为在C ++ 03中没有移动构造函数或移动赋值操作符,在C ++ 03中简化为“始终”),复制构造函数是自动生成的§12.8/ 8)。
  • 如果没有用户声明的移动构造函数或移动赋值运算符(§12.8/ 19),则会自动生成复制赋值运算符。
  • 如果没有用户声明的析构函数(§12.4/ 4),则析构函数是自动生成的。

仅限于C ++ 11和更高版本:

  • 如果没有用户声明的复制构造函数,复制赋值运算符或析构函数,并且生成的移动构造函数有效(例如,如果不需要分配常量成员)(§12.8/ 10),则移动构造函数是自动生成的。 。
  • 如果没有用户声明的复制构造函数,复制赋值运算符或析构函数,以及生成的移动赋值运算符是否有效(例如,如果不需要指定常量成员),则自动生成移动赋值运算符(§12.8/ 21)。

我发现下面的图非常有用。

向原作者道歉,我不记得我从哪里得到的。

自动构造函数和赋值运算符的C ++规则