所以玩弄移动语义。
所以我第一次看到这个是这样的:
class String
{
char* data;
int len;
public:
// Normal rule of three applied up here.
void swap(String& rhs) throw()
{
std::swap(data, rhs.data);
std::swap(len, rhs.len);
}
String& operator=(String rhs) // Standard Copy and swap.
{
rhs.swap(*this);
return *this;
}
// New Stuff here.
// Move constructor
String(String&& cpy) throw() // ignore old throw construct for now.
: data(NULL)
, len(0)
{
cpy.swap(*this);
}
String& operator=(String&& rhs) throw()
{
rhs.swap(*this);
return *this;
}
};
看着这个。我认为根据 Move 赋值定义 Move 构造函数可能是值得的。它具有很好的对称性,我喜欢它,因为它看起来也很干(并且喜欢复制和交换)。
所以我将 Move Constructor 重写为:
String(String&& cpy) throw()
: data(NULL)
, len(0)
{
operator=(std::move(cpy));
}
但这会产生歧义错误:
String.cpp:45:9: error: call to member function 'operator=' is ambiguous
operator=(std::move(rhs));
^~~~~~~~~
String.cpp:32:13: note: candidate function
String& operator=(String rhs)
^
String.cpp:49:13: note: candidate function
String& operator=(String&& rhs) throw()
^
1 error generated.
由于我std::move()
在传递参数时使用了我希望它绑定到移动赋值运算符。我究竟做错了什么?