【发布时间】:2015-11-20 23:09:45
【问题描述】:
我发生了一些我认为完全合理的事情,但我希望人们对此发表意见,以防我完全错过了什么。所以首先,我对T& operator=(T&& rhs) 的理解是,我们不在乎当我们完成时rhs 的内容是什么,只是内容已经移入this 并且@ 987654326@ 可以安全销毁。
话虽如此,复制赋值运算符的常见异常安全实现,假设交换成本低廉,如下所示:
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 拥有的东西与使用移动构造/交换的版本相比,使用普通交换可能会更长寿。
想法?
【问题讨论】:
-
我更喜欢这个答案末尾的移动分配:stackoverflow.com/a/3279550/4342498
-
请注意,您可以使用
T& operator=(T rhs) { rhs.swap(*this); return *this; }同时实现两个交换 -
我们不关心完成后 rhs 的内容是什么 是的,我们这样做:它必须处于析构函数的有效状态。例如,当指针传递给另一个对象时,我们不能保留要删除的指针。
-
@Walter。你应该阅读你引用的整个句子。特别是逗号后面的部分,我说“...只是内容已移至
this并且 rhs 可以安全销毁。”
标签: c++ c++11 copy-and-swap move-assignment-operator