使用swap实现移动分配

时间:2015-08-26 18:58:15

标签: c++ c++11 copy-and-swap move-assignment-operator

我觉得有些事情我认为是完全合理的,但是如果我完全遗漏某些东西,我会喜欢别人的意见。首先,我对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;
}

认为这满足了移动分配操作员需要做的...但就像我说的那样,这只是发生在我身上,所以我认为我可能会这样做#39;我遗失了什么。

唯一的缺点"我能想到的是,与执行move-construct / swap的版本相比,this拥有的东西使用普通交换可能会更长寿。

思想?

1 个答案:

答案 0 :(得分:5)

"移动分配操作员需要做什么"

我总是发现处理&&变量的最佳方法是说"没有人关心我将这个变量放在"中的状态。你可以从中移动。您可以从中进行复制。你可以交换它。你还可以做更多的事情。

您的代码是正确的。 &&可以保留在任何状态(只要它是可破坏的)。

对象迟早会被破坏(可能更早),实施者应该意识到这一点。如果析构函数将delete原始指针,这将是重要的,如果相同的原始指针位于多个对象中,这将导致双重删除。

相关问题