c++ - 将右值引用分配给左值时发生了什么?

标签 c++ move rvalue

我有一个简单的例子:

void Message::move_Folders(Message *m) {
    m_folders = std::move(m->m_folders);
    for (auto f : m_folders) {
        f->removeMessage(m);
        f->addMessage(this);
    }
    m->m_folders.clear();
}

此函数可以将“文件夹”成员从一个 move 到另一个。所以我想知道:我需要为“文件夹”提供 move 分配功能吗?

folders &operator=(folders &&f) {
    ...
}

将右值引用分配给左值时发生了什么?还是复制操作? (我相信不是。)

注意:文件夹是一组文件夹对象。一条消息可能属于多个文件夹。所以一条消息包含一组文件夹。该文件夹还有一个成员 messages。一个文件夹可能包含许多消息。有点复杂。

这是MessageFolder的定义:

class Message {
public:
// constructor and destructor
...
private:
    std::set<Folder *> m_folders;
...
};

class Folder {
friend class Message;
//constructor and destructor
...
private:
    std::set<Message *> m_messages;
};

谢谢

最佳答案

请注意,std::move 不会 move 任何东西;相反,它使事物可 move 。因此,为了真正将 m->folders move 到 this->folders 中, move 赋值确实必须执行该逻辑。

事实上, move 分配应该负责定义 move 语义:move_folders 方法不必清除 m->folders,因为它不应该知道这个细节。

关于c++ - 将右值引用分配给左值时发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58375884/

相关文章:

c++ - 返回临时的右值作为值

c++ - 第一个参数没有从 'A' 到 'A &&' 的已知转换

c++ - 使用模板元编程将模板函数 bool 参数转置为运行时函数参数

git - 使用 git clone --mirror 和 git push --mirror move git repo

php - 多图上传文件上传数量错误

c++ - 使用 unique_ptr 保证工厂中的唯一对象

c++ - 摩西中对 `gzopen' 的 undefined reference

c++ - 原始的C++默认构造函数?

c++ - libc++ 的 unordered_set.reserve 的 bucket_count

C++ 在类中定义 RValue 属性