看板 C_and_CPP 關於我們 聯絡資訊
前陣子書唸不下去跑去玩 rvalue reference 為自己有 value 語意的 classes 都加上 move constructor 和 move assignment operator 但是在應用上發現一點小問題 在原文介紹中寫了一個像這樣的範例: s1 + " " + s2 + " " + s3 ... blah blah 由於+運算是左結合, 所以實際上要寫出 V operator +( T &&, const U & ) 這種簽名的非成員重載才有用 再來看另一種情況, 假設有個很喜歡 jQuery 風格的人 把他的函式庫弄得跟 jQuery 寫法一樣: String( "bb" ).replace( 0, 3 ).reverse().prepend( "aaa" ).length() 那麼這是不是很難受益於 rvalue reference? (假設它們都回傳一個暫時物件, 不是 reference. 他可能喜歡 immutable string) 因為 operator 可以有非成員重載, 但具名函式卻不行 直接 return 一個 rvalue reference 好像也怪怪的 另外, 考慮到各種不同的 bind 狀況 同樣的 binary operator 似乎也需要做多種不同的 overloading 這時候是否是使用 std::forward 來把原本是 member operator 的 版本 forward 給一個 nonmember operator 版本? 後來越寫感到越奇怪, 就停在 move ctor/operator = 的階段 因為越想好像就要寫越多重載版本 = = -- 自High筆記(半荒廢) http://legnaleurc.blogspot.com/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.205.248.119
loveme00835:第一個問號: 你無法知道自己是不是暫時物件, 第二個問 02/07 22:16
loveme00835:號 + 的實作通常是委派給 +=, 其他類似的運算子也是如 02/07 22:17
loveme00835:此, 要讓自己的類別使用起來像內建型態非常的不容易, 02/07 22:18
loveme00835:光std::string就作了很多奇怪的重載版本, 不過也多虧 02/07 22:19
loveme00835:他這麼麻煩, 才不會讓程式設計師寫出很多語意很奇怪的 02/07 22:20
loveme00835:碼, r-value ref 是用來增加效率, 並不是用來補強為了 02/07 22:21
loveme00835:語法方便所帶來的副作用 02/07 22:21
legnaleurc:我想這就是我的問題, 自己就是個暫時物件的情況 02/07 23:26
legnaleurc:其比例並不算小, 但 rvalue ref 給我的感覺是它比較適 02/07 23:27
legnaleurc:合用在 operand 上 ... 至少語法上比較方便 02/07 23:27
loveme00835:自己是暫時物件的情況比較常出現是在作為函式引數的情 02/07 23:39
loveme00835:況, 就像 binary operator, 像您這樣用暫時物件再產生 02/07 23:40
loveme00835:更多暫時物件的情況是比較不被建議使用的, 如 02/07 23:41
loveme00835:Exceptional C++ 一書中所提到的, 不只中途可能出錯 02/07 23:42
loveme00835:測試的複雜度也會提高 02/07 23:42
loveme00835:考慮這樣的敘述 obj2 = (obj1 = Object()).clone(); 02/08 00:20
loveme00835:這樣的資源應該由誰來擁有呢? 02/08 00:21
legnaleurc:括號內就已經算是左值了吧 02/08 00:23
loveme00835:挖勒上面例子舉得不太好...Orz 02/08 00:23
legnaleurc:我的意思是你總不可能每產生一次暫時物件就用一個左值 02/08 00:24
legnaleurc:去接, 比方說 Qt 的 QString::arg() 系列 02/08 00:25
legnaleurc:正常人都會用 s.arg().arg() 的方式去用它 02/08 00:26
legnaleurc:所以最後這是使用者的責任嗎? 在確定是右值的狀況下 02/08 00:31
legnaleurc:用 std::move 來強制指定? 02/08 00:32
loveme00835:我怎麼覺得在 Data Flow Testing 的觀點這是不正常的 02/08 00:32
legnaleurc:不過仔細想想 ... 好像也沒用, 怎麼讓 *this 變右值? 02/08 00:33
loveme00835:用法...java這樣作是可以再作進一步的最佳化或用heap 02/08 00:33
loveme00835:base object來減少出錯機率, 不過 this 變右值我記得 02/08 00:35
loveme00835:N2439 有提到 02/08 00:35
loveme00835:可以參考 N2377 02/08 00:39
legnaleurc:呣, 看來VC10還沒實裝 ... N2377 的意思應該是當實體 02/08 00:46
legnaleurc:可被推導成右值時, 就喚起修飾為 rvalue instance 的 02/08 00:46
legnaleurc:版本吧? 如果是這樣的話還滿實用的 02/08 00:47
legnaleurc:gcc 也還沒實裝 ... 我看等它們都實裝了我再跟進好了 02/08 01:09
legnaleurc:雖然可能要等上一年半載 ... 02/08 01:09
yoco315:c++ 真的變的好恐怖... 02/08 03:20
legnaleurc:坦白說這樣還是要寫很多重載版本啊= = 02/08 15:28
VictorTom:不不, C++一直都很恐怖....(抖~_~) 02/08 22:47
james732:同意樓上,C++越學越覺得我什麼都不會... 02/09 02:50
james732:這篇文章我都看不懂 orz 02/09 02:51