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

时间:2017-05-13 15:25:56

标签: c++ c++11 gcc g++

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

2 个答案:

答案 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。