ZHO*_*HOU 2 c++ move-semantics copy-assignment
这些是我的原型,
MyClass& operator=(MyClass rhs); // copy assignment
MyClass& operator=(MyClass &&rhs); // move assignment
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时
MyClass a, b;
a = std::move(b);
Run Code Online (Sandbox Code Playgroud)
,有一个错误.
556 IntelliSense: more than one operator "=" matches these operands:
function "MyClass::operator=(MyClass rhs)"
function "MyClass::operator=(MyClass &&rhs)"
operand types are: MyClass = MyClass
Run Code Online (Sandbox Code Playgroud)
并且编译器返回:
Error 56 error C2593: 'operator =' is ambiguous
Run Code Online (Sandbox Code Playgroud)
因为当你传递一个右值,这两个重载决策是模糊的MyClass,并MyClass &&可以通过它可以直接初始化.
如果要提供复制和移动赋值的不同实现,通常的方法是通过const引用获取复制赋值运算符的参数:
MyClass& operator=(const MyClass &rhs); // copy assignment
MyClass& operator=(MyClass &&rhs); // move assignment
Run Code Online (Sandbox Code Playgroud)
像这样,移动赋值运算符是(非常量)rvalue参数的严格更好匹配,因此它通过重载决策来选择.
另一种称为复制和交换的方法是仅提供赋值运算符,按值获取参数,并使用swap它来实现它:
MyClass& operator=(MyClass rhs)
{
swap(*this, rhs);
return *this;
};
Run Code Online (Sandbox Code Playgroud)
这会重复使用复制/移动构造函数进行分配.它要求你实现一个swap非抛出的函数.
这种方法的缺点是,有时,手动实现复制分配可能比执行复制构建后移动更便宜.