【发布时间】:2019-10-14 11:32:27
【问题描述】:
我有一个简单的例子:
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();
}
此功能可以将“文件夹”成员从一个移动到另一个。所以我想知道:我需要为“文件夹”提供移动分配功能吗?
folders &operator=(folders &&f) {
...
}
将右值引用分配给左值时发生了什么?还是复制操作吗? (我相信不会。)
注意:文件夹是一组文件夹对象。一条消息可能属于许多文件夹。所以一条消息包含一组文件夹。该文件夹还有一个成员messages。一个文件夹可能包含许多消息。有点复杂。
这是Message和Folder的定义:
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;
};
谢谢
【问题讨论】:
-
在你的例子中
folders是一个成员变量和一个类型,这相当混乱 -
文件夹是一组文件夹对象。一条消息可能属于许多文件夹。所以一条消息包含一组文件夹。
-
@ZhenYang 请在问题中包含
folders的定义,我认为这不会引起混淆。请阅读minimal reproducible example -
@RichardCritten 我已经添加了消息和文件夹的定义。我认为 std::set 已经执行了移动分配。你认为是吗?但是 m->m_folders.clear();正如 xtofl 所说,没有必要。
-
folders &operator=(folders &&f)应该是Folder& operator=(Folder&& f),这就是最初引起我困惑的原因