[問題] Rvalue Reference

看板C_and_CPP作者 (拋磚引玉)時間15年前 (2010/12/10 01:24), 編輯推噓1(1020)
留言21則, 3人參與, 最新討論串1/1
遇到的問題(Question): 我在學習 Rvalue Reference 的用法 (程式碼如下) 裡面重點是兩個 operator+ 候選一是普通的作法,候選二是 Rvalue Reference 的作法 裡面 str1+str2+str3+str4; 這句 str1 + str2 -> tmp 呼叫候選一,產生暫時物件,沒問題 tmp + str3 -> tmp 呼叫候選二,不會再產生新暫時物件,沒問題 tmp + str4 -> tmp 我想,應該要呼叫候選二,但是卻呼叫了候選一 餵入的資料(Input): NaN 希望的正確結果(Expected Output): 只有在 str1+str2 的時候呼叫候選一 之後的都呼叫候選二 跑出來的錯誤結果(Wrong Output): 在呼叫候選二之後,再做 operator+,就會呼叫候選一 I don't know why? 開發平台(Platform): (例: VC++, Gcc, OpenGL, Linux, ...) gcc 4.5 on Ubuntu 10.04 程式碼(Code): (請善用置底文標色功能) http://nopaste.csie.org/bf332 補充說明(Supplement): Thank you all! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.207 ※ 編輯: nowar100 來自: 140.112.29.207 (12/10 01:25)

12/10 01:32, , 1F
候選二回傳型態是 String& 等同於具名物件, 即l-value
12/10 01:32, 1F

12/10 01:34, , 2F
可是我不想讓他多產生暫時物件,又要回傳回去,還有其他
12/10 01:34, 2F

12/10 01:35, , 3F
辦法嗎?也不能回傳 String&& 阿 謝謝 :D
12/10 01:35, 3F

12/10 01:35, , 4F
std::move( str1+str2+str3 ) + str4;
12/10 01:35, 4F

12/10 01:36, , 5F
或者你可以回傳 String, 再寫一個 String(String&&)
12/10 01:36, 5F

12/10 01:37, , 6F
在候選二return的地方拿來建構新的暫時物件
12/10 01:37, 6F

12/10 01:38, , 7F
我就是不想用std::move 不過String(String&&)我試試...
12/10 01:38, 7F

12/10 01:40, , 8F
不對阿 照這樣說 不就還是要再建構一個新的物件...
12/10 01:40, 8F

12/10 01:40, , 9F
你叫String(String&&)的時候還是會需要 std::move...
12/10 01:40, 9F

12/10 01:40, , 10F
我就是想用str1+str2+... 這種 只產生一個暫時物件就好
12/10 01:40, 10F

12/10 01:41, , 11F
這個新建構的物件可以直接搶傳進來物件的資源, 成本不
12/10 01:41, 11F

12/10 01:41, , 12F
會很高= ="
12/10 01:41, 12F

12/10 01:48, , 13F
我懂你的意思了謝謝! 所以還是沒有辦法做到不用暫時物件
12/10 01:48, 13F

12/10 01:48, , 14F
只是說那個暫時物件內容轉移的成本可以被降低 這樣吧
12/10 01:48, 14F

12/10 01:49, , 15F
不然 以前沒有RvalueRef的時候都要真正的去拷貝內容
12/10 01:49, 15F

12/10 01:50, , 16F
嗯嗯...本來operator是回傳複本的, 回傳String& 有點
12/10 01:50, 16F

12/10 01:50, , 17F
怪怪@_@
12/10 01:50, 17F

12/10 01:52, , 18F
STL 的容器也都有 && 版本的建構子啦~
12/10 01:52, 18F

12/10 02:10, , 19F
嗯嗯 謝謝 :D
12/10 02:10, 19F

12/11 02:18, , 20F
大方地回傳 String && 就可以了。不過要 static_cast。
12/11 02:18, 20F

12/11 02:20, , 21F
或者 return std::move(lhs);
12/11 02:20, 21F
文章代碼(AID): #1D0H3fbM (C_and_CPP)