为什么定义了移动构造函数并隐式删除了赋值运算符?

Bru*_*uce 3 c++ gcc g++ c++11

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中,这是错误的.为什么?

Sam*_*hik 8

答案是因为C++标准如此说:

[class.copy]

如果类定义没有显式声明复制构造函数,则会隐式声明一个.如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除; 否则,它被定义为默认值(8.4).

在您的情况下,您始终可以声明默认的复制构造函数:

 Foo(const Foo&) = default;
Run Code Online (Sandbox Code Playgroud)