Re: [問題] pass iterator by reference

看板C_and_CPP (C/C++)作者 (非議)時間13年前 (2012/08/10 14:37), 編輯推噓7(700)
留言7則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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

08/10 14:56, , 1F
了解了!! 感謝解惑
08/10 14:56, 1F

08/10 17:56, , 2F
C++真是太不可思議了
08/10 17:56, 2F

08/10 18:07, , 3F
推!
08/10 18:07, 3F

08/10 18:10, , 4F
負責寫Compiler的: C++11真是太不可思議了!!!! fxxk!!!
08/10 18:10, 4F

08/10 22:03, , 5F
講解的我聽的懂耶!推~
08/10 22:03, 5F

08/10 23:30, , 6F
推XD
08/10 23:30, 6F

08/12 15:30, , 7F
專業!
08/12 15:30, 7F
文章代碼(AID): #1G9AmJ-W (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1G9AmJ-W (C_and_CPP)