按照这份报告,如果复制构造函数或复制赋值操作符是“用户声明的”,则不会生成隐式移动操作。复制构造函数或复制赋值操作符的delete
是否算作“用户声明”?
struct NoCopy {
NoCopy(NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;
};
是否会为NoCopy
类生成隐式移动操作?还是删除相关的副本操作意味着“用户声明”,从而抑制隐式移动生成?
如果可能的话,我更喜欢引用标准相关部分的答案。
发布于 2015-03-10 12:28:47
根据演示文稿的幻灯片14,删除的副本构造函数是“用户声明的”,从而抑制了移动生成。
发布于 2015-03-10 13:56:56
“用户声明”一词在标准中没有正式的定义。在特殊成员函数的上下文中,它是与“隐式声明”相反的。dcl.fct.def.default/4可以更清楚地说明这一事实,但其意图是:
显式默认函数和隐式声明函数统称为默认函数,实现应为它们提供隐式定义(12.1,12.4,12.8),这可能意味着将它们定义为已删除。一个特殊的成员函数是用户提供的,如果它是用户声明的,并且在第一个声明中没有显式的默认或删除。用户提供的显式默认函数(即,在其第一次声明后显式默认)将在显式默认的位置定义;如果此函数被隐式定义为已删除,则程序的格式不正确。
NoCopy(NoCopy&) = delete;
和NoCopy& operator=(const NoCopy&) = delete;
都是特殊成员函数的声明。由于您是显式声明它们,而不是允许编译器隐式声明它们,所以它们是用户声明的。因此,这些声明将抑制move构造函数的隐式声明,并按照class.Copy/9移动赋值操作符:
如果类
X
的定义没有显式声明移动构造函数,则将隐式声明为defaulted当且仅当 -X
没有用户声明的复制构造函数, -X
没有用户声明的副本赋值操作符, -X
没有用户声明的移动赋值操作符, -X
没有用户声明的析构函数,并且 -移动构造函数不会被隐式定义为已删除。
https://stackoverflow.com/questions/28963577
复制相似问题