作者shadow0326 (非議)
看板C_and_CPP
標題Re: [問題] pass iterator by reference
時間Fri Aug 10 14:37:04 2012
※ 引述《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