看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題(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)
loveme00835:候選二回傳型態是 String& 等同於具名物件, 即l-value 12/10 01:32
nowar100:可是我不想讓他多產生暫時物件,又要回傳回去,還有其他 12/10 01:34
nowar100:辦法嗎?也不能回傳 String&& 阿 謝謝 :D 12/10 01:35
loveme00835:std::move( str1+str2+str3 ) + str4; 12/10 01:35
loveme00835:或者你可以回傳 String, 再寫一個 String(String&&) 12/10 01:36
loveme00835:在候選二return的地方拿來建構新的暫時物件 12/10 01:37
nowar100:我就是不想用std::move 不過String(String&&)我試試... 12/10 01:38
nowar100:不對阿 照這樣說 不就還是要再建構一個新的物件... 12/10 01:40
loveme00835:你叫String(String&&)的時候還是會需要 std::move... 12/10 01:40
nowar100:我就是想用str1+str2+... 這種 只產生一個暫時物件就好 12/10 01:40
loveme00835:這個新建構的物件可以直接搶傳進來物件的資源, 成本不 12/10 01:41
loveme00835:會很高= =" 12/10 01:41
nowar100:我懂你的意思了謝謝! 所以還是沒有辦法做到不用暫時物件 12/10 01:48
nowar100:只是說那個暫時物件內容轉移的成本可以被降低 這樣吧 12/10 01:48
nowar100:不然 以前沒有RvalueRef的時候都要真正的去拷貝內容 12/10 01:49
loveme00835:嗯嗯...本來operator是回傳複本的, 回傳String& 有點 12/10 01:50
loveme00835:怪怪@_@ 12/10 01:50
loveme00835:STL 的容器也都有 && 版本的建構子啦~ 12/10 01:52
nowar100:嗯嗯 謝謝 :D 12/10 02:10
LoganChien:大方地回傳 String && 就可以了。不過要 static_cast。 12/11 02:18
LoganChien:或者 return std::move(lhs); 12/11 02:20