我可以为一个类编写复制和移动赋值运算符吗?

时间:2015-04-17 12:06:35

标签: c++ move-semantics copy-assignment

这些是我的原型,

MyClass& operator=(MyClass rhs);   // copy assignment
MyClass& operator=(MyClass &&rhs); // move assignment

但是当我打电话时

MyClass a, b;
a = std::move(b);

,有一个错误。

556 IntelliSense: more than one operator "=" matches these operands:
        function "MyClass::operator=(MyClass rhs)"
        function "MyClass::operator=(MyClass &&rhs)"
        operand types are: MyClass = MyClass    

编译器返回:

Error   56  error C2593: 'operator =' is ambiguous  

1 个答案:

答案 0 :(得分:6)

重载分辨率不明确,因为当您传递右值时,MyClassMyClass &&都可以直接初始化。

如果要提供复制和移动赋值的不同实现,通常的方法是通过const引用获取复制赋值运算符的参数:

MyClass& operator=(const MyClass &rhs);   // copy assignment
MyClass& operator=(MyClass &&rhs); // move assignment

完成后,移动赋值运算符与(非常量)右值参数完全匹配,因此可以通过重载决策来选择。

另一种称为复制和交换的方法是仅提供赋值运算符,按值获取参数,并使用swap来实现它:

MyClass& operator=(MyClass rhs)
{
  swap(*this, rhs);
  return *this;
};

这会重复使用复制/移动构造函数进行分配。它要求你实现一个swap函数,该函数应该是非抛出函数。

这种方法的缺点是,有时候,手动实施复制分配比执行复制构建然后移动要便宜。