我希望能够重新了解编译器通常在哪些情况下会自动生成默认构造函数、复制构造函数和赋值运算符。
我记得有一些规则,但是我不记得了,而且在网上也找不到可靠的资源。有人可以帮助吗?
我希望能够重新了解编译器通常在哪些情况下会自动生成默认构造函数、复制构造函数和赋值运算符。
我记得有一些规则,但是我不记得了,而且在网上也找不到可靠的资源。有人可以帮助吗?
我发现下面的图表非常有用。
= delete
(显而易见)或= default
(对我来说不太明显)的两种情况。我是对的吗? - EnlicoC++17 N4659标准草案
如果需要快速查阅跨标准的参考信息,请查看以下cppreference条目中的“隐式声明”部分:
当然,同样的信息也可以从标准中获得。例如,在C++17 N4659标准草案上:
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)。如果类具有用户声明的复制构造函数或用户声明的析构函数,则后一种情况已弃用。
对于移动赋值运算符:
如果类X的定义没有显式声明移动赋值运算符,则只有在以下情况下才会隐式声明默认移动赋值运算符:
const
成员放入类中会防止自动生成构造函数... - nonsensickle