这些是我的原型,
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
答案 0 :(得分:6)
重载分辨率不明确,因为当您传递右值时,MyClass
和MyClass &&
都可以直接初始化。
如果要提供复制和移动赋值的不同实现,通常的方法是通过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
函数,该函数应该是非抛出函数。
这种方法的缺点是,有时候,手动实施复制分配比执行复制构建然后移动要便宜。