我有一个简单的例子:
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;
};
谢谢
注意std::move
不会移动任何东西;相反,它使事物movable。因此,为了将m->folders
实际移到this->folders
中,实际上,移动分配必须执行该逻辑。
实际上,移动分配应该是负责定义移动语义的:move_folders
方法不必清除m->folders
,因为它不应该知道此细节。
您不需要需要提供移动分配运算符,但是如果您不提供,则呼叫确实会降级为副本。