引用摺疊:建立引用的引用時(如模板引數、型別別名)會造成引用摺疊,摺疊規則如下:1.&+&->&&&+&->&2.&&+&&->&&3.左值(非引用)+&&(模板形參的)->&,實際上是:編譯器會自己在模板形參型別前加&,這樣就變成了:&+&&,依據前面的規則還是會摺疊為&。注意:第3種情況只適用於&&形參的模板函式,不適合普通函式!例子:&+&&->&
templatet ff(t&&x)其中fff(i)的呼叫是錯誤的!因為傳遞了乙個左值給乙個引數為右值引用的函式。ff(i)的呼叫是正確的,通過引用摺疊,實際呼叫的函式是int ff(int&);int fff(int &&x)
intmain()
引用摺疊了:i是普通int變數,普通左值按規則3,得到&
5是右值,沒有引用摺疊
p為int [10]型別,但這裡由於符合上面第三條,加&得到int (&)[10],即乙個int[10]陣列的引用的型別。然後進行引用摺疊:int (&)[10]+&&->int(&)[10],還是自己。
如果把函式改成這樣:
templatet ff(t x)即f的引數不再是右值引用,那麼就不存在引用摺疊問題了,並且陣列p傳入f函式時,會自動轉為int*型別:intmain()
另乙個例子:
typedef constintt;
typedef t&tr;
typedef t&&trr;
void
judgetype()
intmain()
templatet ff(t&&x)目前我只能認為只要能匹配&&的(通過引用摺疊匹配的也算),都去匹配&&版本了。。template
t ff(const t&x)
intmain()
帶const的都匹配不了&&,只能匹配const t&
C 右值引用和引用摺疊
當我們將乙個左值傳遞給右值引用引數時,且此右值引用指向模板型別引數 t 時,編譯器推斷模板型別引數為左值引用型別而非左值。當我們間接建立乙個引用的引用,如型別別名或模板引數,則這些引用形成了摺疊 因為有上述兩個規則,所以如果乙個函式引數是指向模板引數型別的右值引用,則可以傳遞給它任意型別的實參。如果...
如何理解c 中的引用摺疊
感覺上叫引用坍塌好理解點 reference collapsing rules 就這樣a 變成 a a 變成 a a 變成 a a 變成 a 就是左值引用會傳染,只有純右值 沾上乙個左值引用就變左值引用了 引用摺疊的規則上面的各位已經說得很清楚了,我在這裡補充下引用摺疊是為什麼出現的吧。要說引用摺疊...
C 學習筆記 引用摺疊和模板右值引用引數
函式模板進行引數傳遞時,對引用的傳遞有兩個例外規則 引用摺疊只能應用於間接建立的引用的引用,如型別別名或者模板引數,我們不能直接建立引用的引用。template void fun t val 定義fun為模板函式,引數型別為 int i 0 fun i i是左值,實參將會被推斷為int int j ...