struct Foo
{
Foo() = default;
Foo(Foo&&) = default;
};
int main()
{
Foo a, b;
a = b;
// ^
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:使用已删除的函数'Foo&Foo :: operator =(const Foo&)'
在g ++ 4.6 -std = c ++ 0x中没关系.但是,在g ++ 6.2 -std = c ++ 11中,这是错误的.为什么?
答案是因为C++标准如此说:
[class.copy]
如果类定义没有显式声明复制构造函数,则会隐式声明一个.如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除; 否则,它被定义为默认值(8.4).
在您的情况下,您始终可以声明默认的复制构造函数:
Foo(const Foo&) = default;
Run Code Online (Sandbox Code Playgroud)