簡體   English   中英

將右值引用分配給左值時發生了什么?

[英]What happened when assigning an rvalue reference to lvalue?

我有一個簡單的例子:

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();
}

這個 function 可以將“文件夾”成員從一個移動到另一個。 所以我想知道:我需要為“文件夾”提供移動分配 function 嗎?

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不會移動任何東西; 相反,它使事物可移動 因此,為了實際將m->folders移動到this->folders中,移動分配確實必須執行該邏輯。

事實上,移動分配應該負責定義移動語義: move_folders方法不必清除m->folders ,因為它不應該知道這個細節。

是否需要提供用戶定義的移動分配取決於您已經定義了哪些其他特殊成員,請參見圖像了解組合: 在此處輸入圖像描述

因此,如果 Folders 沒有用戶定義的析構函數、復制構造函數或賦值運算符,則移動構造函數和賦值將由編譯器隱式聲明。 否則你需要自己寫一個。

將右值分配給左值時發生了什么? 還是復制操作嗎? (我相信不會。)

這取決於您是否有移動分配,它會移動,否則它將復制。

最后,您是否需要為您的文件夾 class 移動分配來移動 std::set 實際上是否,因為 std::set 的移動分配不會使用默認分配器一一移動內容。

不需要提供移動分配運算符,但如果您不這樣做,調用確實會降級為副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM