看板 C_and_CPP 關於我們 聯絡資訊
先說說我對rvalue reference的理解 假設有一個class myClass內包含指向heap記憶體的指標變數 在實作以myClass為引數建構子的時候 可以實作出引數lvalue及rvalue reference的版本 我看的書是分別稱作copy建構子跟move建構子 lvalue的版本代表引數不是一個暫時物件,之後還有可能會使用 因此新的物件必須要new出新的記憶體,再讓記憶體內容與作為引數的物件一致 rvalue的版本代表引數是一個暫時物件,在建構子結束後就會解構掉 因此可以讓新物件的指標直接與這個暫時物件的指標指向同個位置,免去new的動作 再讓暫時物件的指標指向NULL以免呼叫解構子時將塊記憶體delete掉 同樣的道理也可以用在operator=上 現在有o1,o2,o3三個myClass的實例 若myClass也有多載operator+ o1=o2+o3; 這時o1.operator=()會呼叫rvalue的版本,因為o2.operator+(o3)是一個暫時物件 而operator+()因為回傳的是一個暫時物件,回傳後就會刪除 所以回傳型態必須是myClass,不能是myClass& 這時候就會用到建構子將o2.operator+(o3)複製後再傳入o1.operator=() 但這次的建構子卻是呼叫lvalue的版本的copy建構子 這邊的原因我就不太理解,從書上看到是因為在o2.operator+(o3)中 這個回傳的暫時物件是有名字的(假設他叫result) 所以會被視作lvalue而呼叫lvalue的copy建構子 若希望能呼叫move建構子,則應該在return時使用std::move(result) 請問各位前輩我這樣的理解正確嗎? 另外有一個問題請教,通常operator+() operator-()因回傳的變數是區域變數 這些運算子會回傳一個新的物件而不是區域變數reference 而operator=() 則因為結果不是個區域變數而可以回傳lvalue reference 那又什麼情況我們會回傳rvalue reference嗎? 不好意思再補充個問題 在java中若我有兩個reference a,b 我可以用a=b讓a指向與b相同的物件 但在C++中a=b卻是會呼叫a指向的物件的operator=() a實際上還是指向原來的物件(用取址運算子就可發現) 那有辦法讓a指向別的物件嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.114.218.24 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1476007937.A.937.html ※ 編輯: w0005151 (58.114.218.24), 10/09/2016 18:20:03
pttworld: 精華區資料多,z-5。 10/09 18:27
Caesar08: 板上有很多文章,你應該先看一下。另外,你現在用的move 10/09 20:10
Caesar08: 就會return rvalue reference 10/09 20:10
steve1012: rvalue跟是不是暫時物件不是這直接關聯的 10/09 22:50
steve1012: 他的意思是 這塊記憶我可以直接拿來用 所以我用它來con 10/09 22:50
firose: 印象最深刻的還是 local 被傳回會被視為右值 (C++14) 10/10 07:47