我想到了一些我认为完全合理的事情,但我希望人们对此发表意见,以防万一我完全遗漏了一些东西。所以首先,我对T& operator=(T&& rhs)
的理解是我们不在乎 rhs
的内容是什么当我们完成时,只是内容已移入 this
还有那个rhs
可安全销毁。
话虽如此,假设交换很便宜,复制赋值运算符的常见异常安全实现如下所示:
T& operator=(const T& rhs) {
if(this != &rhs) {
T(rhs).swap(*this);
}
return *this;
}
因此,实现移动赋值运算符的一种自然方法是这样的:
T& operator=(T&& rhs) {
if(this != &rhs) {
T(std::move(rhs)).swap(*this);
}
return *this;
}
但后来我突然想到,
rhs
不一定是空的!那么,为什么不做一个简单的swap
?T& operator=(T&& rhs) {
rhs.swap(*this); // is this good enough?
return *this;
}
我思这满足移动赋值运算符需要做的事情......但就像我说的,这只是我突然想到的,所以我认为我可能遗漏了一些东西。
我能想到的唯一“缺点”是
this
拥有的东西与执行移动构造/交换的版本相比,使用普通交换可能会活得更久。想法?
最佳答案
“移动赋值运算符需要做什么”
我总能找到最好的方法来治疗 &&
变量是说“没有人关心我把这个变量留在什么状态”。你可以离开它。你可以从中复制。你可以换进去。你可以做更多的事情。
你的代码是正确的。 &&
可以保持任何状态(只要它是可破坏的)。
对象迟早会被破坏(可能更早),实现者应该意识到这一点。如果析构函数将delete
,这很重要原始指针,如果同一个原始指针在多个对象中,这将导致双重删除。
关于c++ - 使用swap实现移动赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234623/