2015-04-17 35 views
1

这是我的原型,我可以为班级编写复制和移动赋值操作符吗?

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 
+6

智能感知错误并不总是真正的编译器错误。 – drescherjm

+4

尝试更改复制赋值运算符以获取*引用*,最好是一个常量引用。 –

+5

“MyClass”类型的右值同时绑定到两个函数。这确实是不明确的。 –

回答

5

重载决策是模糊的,因为当你传递一个右值,既MyClassMyClass &&可以直接由它初始化。

如果你想实现一个不同的复制和移动作业,习惯的方式是通过const引用取拷贝赋值运算符的参数:

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

做过这样的举动赋值运算符是一个严格匹配(非const)右值参数,所以它是通过重载解析来选择的。

的另一种方法,称为拷贝和交换,是只提供赋值操作符,采取由值的参数,并使用swap实现它:

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

这重用了复制/移动构造作业。它要求你实现了一个swap函数,该函数应该是非抛出的。

这种方法的不足之处在于,有时候,手动执行复制分配可能比执行复制构建然后移动便宜。

+0

我的复制赋值操作符与您的完全一样。这是否意味着,通过这种方式,MyClass&operator =(MyClass rhs)既是复制操作又是移动赋值操作符? – ZHOU

+0

@周正式来说,不,它只是一个拷贝赋值操作符。但假设你有一个移动构造函数,可以预期,对于rvlaues,复制和交换赋值操作符将与移动赋值操作符一样高效。 – Angew

相关问题