C 的引用摺疊

2022-05-08 22:00:10 字數 1537 閱讀 2857

引用摺疊:建立引用的引用時(如模板引數、型別別名)會造成引用摺疊,摺疊規則如下:1.&+&->&&&+&->&

&+&&->&

2.&&+&&->&&3.左值(非引用)+&&(模板形參的)->&,實際上是:編譯器會自己在模板形參型別前加&,這樣就變成了:&+&&,依據前面的規則還是會摺疊為&。注意:第3種情況只適用於&&形參的模板函式,不適合普通函式!例子:

templatet ff(t&&x)

int fff(int &&x)

intmain()

其中fff(i)的呼叫是錯誤的!因為傳遞了乙個左值給乙個引數為右值引用的函式。ff(i)的呼叫是正確的,通過引用摺疊,實際呼叫的函式是int ff(int&);

引用摺疊了:i是普通int變數,普通左值按規則3,得到&

5是右值,沒有引用摺疊

p為int [10]型別,但這裡由於符合上面第三條,加&得到int (&)[10],即乙個int[10]陣列的引用的型別。然後進行引用摺疊:int (&)[10]+&&->int(&)[10],還是自己。

如果把函式改成這樣:

templatet ff(t x)

intmain()

即f的引數不再是右值引用,那麼就不存在引用摺疊問題了,並且陣列p傳入f函式時,會自動轉為int*型別:

另乙個例子:

typedef const

intt;

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 ...