看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《tac0wu (他口)》之銘言: : → tac0wu:原本code有點臭長 類似像這樣http://codepad.org/KuMP6Imb 08/10 13:24 : → tac0wu:const <>::iter 08/10 13:24 : → tac0wu:http://codepad.org/4UpxRqgz 阿不過好像這樣改就可以了 08/10 13:28 : → tac0wu:該不會是begin回傳出來的東西是const <>::iterator orz 08/10 13:34 : → adxis:原本的寫法傳給func()的是一個暫存值(rvalue ref 08/10 13:55 就像a大說的那樣,問題出在 rvalue refference 1. 何謂 rvalue? 定義可能有許多種,不過在討論 rvalue refference 時 這邊的 rvalue 的意思是「臨時的、不具名的表達式或對象」 在那個 statement 之後,rvalue 就會立刻銷毀 例如有個函式長這樣: int foo(){return 5566;} 呼叫時可能會這樣呼叫: int i = foo(); // foo()返回的值是臨時的,它是個 rvalue // 而 i 不會立刻銷毀,它是個 lvalue 2. STL container 的 begin() 回傳的 iter 不是 ref,是 copy by value 也就是說,是個 rvalue 3. 傳統上,C++ 禁止 ref to rvalue 乍看之下這是有道理的,因為 rvalue 會被立即銷毀 ref 到會被銷毀的東西不是很危險嗎? 所以 string::iterator &it = s.begin(); 就會炸掉 But,為求便利性等等微妙的理由,這邊有個弔詭的例外 那就是 C++ 允許 ref to const value 是可以 ref rvalue 的 這邊我不知道要怎麼表達比較好,以下這個例子是合法的 const string::iterator &it = s.begin(); 且那個本該立即銷毀的 rvalue "s.begin()" 壽命會被延長到和參考它的 ref "it" 一樣長 4. 上面講到"傳統上",事實上 C++11 就增加了 rvalue refference 的語法 "&&" 用來滿足一些最佳化技巧或是高效能的編程 所以你的 code 可以這樣寫 http://ideone.com/GCFJm -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.65.124
tac0wu:了解了!! 感謝解惑 08/10 14:56
diabloevagto:C++真是太不可思議了 08/10 17:56
james732:推! 08/10 18:07
holymars:負責寫Compiler的: C++11真是太不可思議了!!!! fxxk!!! 08/10 18:10
damody:講解的我聽的懂耶!推~ 08/10 22:03
VictorTom:推XD 08/10 23:30
thinklu:專業! 08/12 15:30