【发布时间】:2016-04-28 20:43:55
【问题描述】:
所以从某种意义上说,我们已经漂入了冥界 这里的非确定性破坏:一个变量已分配给, 但是该变量以前持有的对象仍然存在 某处。 只要销毁该对象就可以了 没有任何外界可见的副作用。但是 有时析构函数确实有这样的副作用。一个例子是 释放析构函数内的锁。因此,任何部分 应该执行具有副作用的对象破坏 在复制赋值的右值引用重载中显式 运营商:
X& X::operator=(X&& rhs)
{
// Perform a cleanup that takes care of at least those parts of the
// destructor that have side effects. Be sure to leave the object
// in a destructible and assignable state.
// Move semantics: exchange content between this and rhs
return *this;
}
我知道左值的原始对象通常在非赋值情况下被破坏 - 最终 - 。
但是,在赋值运算符中,你为什么想要同样的行为?
【问题讨论】:
-
有什么问题?
-
@KerrekSB 粗体字。
-
考虑
unique_ptr<T>;如果您有其中 2 个,并且您将一个分配给另一个,您是否不希望目标unique_ptr<T>在它拥有源T的所有权之前删除它拥有的T? -
@Praetorian 但你不只是交换
Ts 吗?所以 rhs 只会承担责任吗? -
你可以那样实现它,但你为什么要这样做?赋值与交换的语义不同,大多数人不会期望你的赋值运算符表现得那样。
标签: c++ c++11 move-semantics