c++ - 使用swap实现移动赋值

标签 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;
}

这满足移动赋值运算符需要做的事情......但就像我说的,这只是我突然想到的,所以我认为我可能遗漏了一些东西。

我能想到的唯一“缺点”是 this 拥有的东西与执行移动构造/交换的版本相比,使用普通交换可能会活得更久。

想法?

最佳答案

“移动赋值运算符需要做什么”

我总能找到最好的方法来治疗 &&变量是说“没有人关心我把这个变量留在什么状态”。你可以离开它。你可以从中复制。你可以换进去。你可以做更多的事情。

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

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

关于c++ - 使用swap实现移动赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234623/

相关文章:

c++ - 如何将 unsigned char * 的内容转换为 const char *?

c++ - GetMessage/PeekMessage - 删除消息队列中的所有消息

c++ - 如何使用 Gtkmm 添加对按钮的响应

c++ - 将 unique_ptrs 从 map 插入 vector 时出错

c++ - 通过接口(interface)完成 copy-and-swap

c++ - [[弃用]] + __attribute__ ((visibility ("default"))) 在 GCC 6.2 中

C++ std::string to char 用于 OpenGL LoadBMP

C++11 枚举类实例化

c++ - copy-and-swap 习语的低效率?

c++ - 通过 copy-and-swap 分配与两个锁