Re: [問題] pass iterator by reference
※ 引述《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
08/10 17:56, 2F
推
08/10 18:07, , 3F
08/10 18:07, 3F
推
08/10 18:10, , 4F
08/10 18:10, 4F
推
08/10 22:03, , 5F
08/10 22:03, 5F
推
08/10 23:30, , 6F
08/10 23:30, 6F
推
08/12 15:30, , 7F
08/12 15:30, 7F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章