struct Foo
{
Foo() = default;
Foo(Foo&&) = default;
};
int main()
{
Foo a, b;
a = b;
// ^
return 0;
}
错误:使用已删除的功能'Foo& Foo :: operator =(const Foo&)'
在g ++ 4.6 -std = c ++ 0x中没关系。 但是,在g ++ 6.2 -std = c ++ 11中,这是错误的。 为什么呢?
答案 0 :(得分:8)
答案是因为C ++标准这样说:
[class.copy]
如果类定义未明确声明副本 构造函数,一个是隐式声明的。如果是类定义 声明一个移动构造函数或移动赋值运算符 隐式声明的复制构造函数被定义为已删除;除此以外, 它定义为默认值(8.4)。
在您的情况下,您始终可以声明默认的复制构造函数:
Foo(const Foo&) = default;
答案 1 :(得分:3)
Sam解释了为什么GCC 6.2的行为是正确的。
GCC 4.6的行为仅仅是由于该版本中不完整的C ++ 11支持(由“实验性”C ++ 0x开关证明);直到4.8才完全支持C ++ 11。