class Class
{
public:
Class& operator=(const Class&&)
{
return *this;
}
};
int main()
{
Class c1;
Class c3(c1);
return 0;
}
为什么添加到类
Class& operator=(const Class&&)
视觉工作室 2017 写道:
E1776 函数“Class::Class(const Class &)”(隐式声明)不能被引用,因为该函数已被删除
必须有一个标准的复制构造函数。
如果一个类至少有一个显式的复制/移动构造函数或相应的赋值运算符,则编译器不会生成其他的。
根据这个问题的现代观点,如果用户显式提供五规则中的任何函数(复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符、析构函数),理想情况下,这应该会导致自动抑制隐式生成五法则的所有其他功能。
但是,为了与现有代码兼容,即 对于“经典”C++98 行为,目前(在 C++17 标准中)此规则仅部分实现,采用以下“妥协”方式:
您在代码中明确提供了移动赋值运算符。这使得第 2 点起作用,并且删除了所有其他五项规则功能。如果您使用类型参数声明赋值运算符
const Class &,则复制构造函数不会在任何地方消失(根据第 1 点)。但是一旦&&你有了 ,你就不必再担心 C++98 的兼容性了。(另外一个问题——你为什么需要这么奇怪的参数类型const Class &&?你想达到什么目的?)第 1 点中描述的行为已被弃用,将来将被删除。也就是说,任何明确提供的五规则函数都将抑制所有其他函数的生成。然而,这将在多长时间内发生是任何人的猜测。