【发布时间】:2011-06-24 01:23:14
【问题描述】:
我想在编译器通常自动生成默认构造函数、复制构造函数和赋值运算符的条件下刷新我的记忆。
我记得有一些规则,但我不记得了,也找不到网上有信誉的资源。有人可以帮忙吗?
【问题讨论】:
标签: c++ copy-constructor default-constructor move-constructor move-assignment-operator
我想在编译器通常自动生成默认构造函数、复制构造函数和赋值运算符的条件下刷新我的记忆。
我记得有一些规则,但我不记得了,也找不到网上有信誉的资源。有人可以帮忙吗?
【问题讨论】:
标签: c++ copy-constructor default-constructor move-constructor move-assignment-operator
在下文中,“自动生成”的意思是“隐式声明为默认值,但未定义为已删除”。在某些情况下,特殊成员函数已声明,但定义为已删除。
【讨论】:
const 成员会阻止自动生成构造函数...
我发现下面的图表非常有用。
【讨论】:
= delete(很明显)或@987654325这两种情况@(对我来说不太明显)。我说的对吗?
C++17 N4659 标准草案
如需快速跨标准参考,请查看以下 cppreference 条目的“隐式声明”部分:
当然可以从标准中获得相同的信息。例如。在C++17 N4659 standard draft:
15.8.1 “复制/移动构造函数”说用于复制构造函数:
6 如果类定义没有显式声明复制构造函数,则隐式声明非显式构造函数。 如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的副本 构造函数被定义为删除;否则,它被定义为默认值 (11.4)。如果后一种情况不推荐使用 该类具有用户声明的复制赋值运算符或用户声明的析构函数。
对于移动构造函数:
8 如果类 X 的定义没有显式声明移动构造函数,则将隐式声明一个非显式构造函数 声明为默认当且仅当
(8.1) — X 没有用户声明的复制构造函数,
(8.2) — X 没有用户声明的复制赋值运算符,
(8.3) — X 没有用户声明的移动赋值运算符,并且
(8.4) — X 没有用户声明的析构函数。
15.8.2 “复制/移动赋值运算符”表示复制赋值:
2 如果类定义没有显式声明复制赋值运算符,则隐式声明一个。 如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的 复制赋值运算符定义为删除;否则,它被定义为默认值 (11.4)。后者 如果类具有用户声明的复制构造函数或用户声明的析构函数,则不推荐使用 case。
对于移动分配:
4 如果类 X 的定义没有显式声明移动赋值运算符,则将隐式 声明为默认当且仅当
- (4.1) — X 没有用户声明的复制构造函数,
- (4.2) — X 没有用户声明的移动构造函数,
- (4.3) — X 没有用户声明的复制赋值运算符,并且
- (4.4) — X 没有用户声明的析构函数。
15.4 “析构函数”对析构函数这么说:
4 如果类没有用户声明的析构函数,则析构函数被隐式声明为默认值 (11.4)。一个 隐式声明的析构函数是其类的内联公共成员。
【讨论】: