C 學習筆記 引用摺疊和模板右值引用引數

2021-10-18 02:26:54 字數 669 閱讀 5326

函式模板進行引數傳遞時,對引用的傳遞有兩個例外規則:

引用摺疊只能應用於間接建立的引用的引用,如型別別名或者模板引數,我們不能直接建立引用的引用。

template

void

fun(t &&val)

;//定義fun為模板函式,引數型別為&&

int i=0;

fun(i)

;//i是左值,實參將會被推斷為int&

int&j = i;

fun(j)

;//傳入的引數為int && &,這時將會從、產生引用摺疊,的、摺疊後傳入的引數實際為 int &.

int&&k =50;

fun(k)

;//這時傳入的引數為 int && &&,將會被摺疊為int &&。

案例:

template

void

fun(t &&val)

int i =0;

int&j = i;

fun(j)

; cout << i << endl;

//輸出i為10

總結:如果乙個函式引數是指向模板引數型別的右值引用(t&&),則可以傳遞給他任意型別的實參,如果將乙個左值傳遞給這樣的引數,則函式引數被例項化為乙個普通的左值引用(t&)。

C 右值引用和引用摺疊

當我們將乙個左值傳遞給右值引用引數時,且此右值引用指向模板型別引數 t 時,編譯器推斷模板型別引數為左值引用型別而非左值。當我們間接建立乙個引用的引用,如型別別名或模板引數,則這些引用形成了摺疊 因為有上述兩個規則,所以如果乙個函式引數是指向模板引數型別的右值引用,則可以傳遞給它任意型別的實參。如果...

右值引用與模板學習筆記

include using namespace std intmain1 void 右值是乙個和運算過程相匹配的臨時物件,這個臨時物件在於其所對應的語句執行完畢之後,就銷毀了 所以,我們無法從語法層面上直接訪問。左值是乙個有名字,有固定位址的表示式 int a 10 int b a const in...

c 右值引用 學習筆記

僅為個人理解,個人筆記 部分 和內容引用於文章從4行 看右值引用 來自鏈結文章裡 include using namespace std int g constructcount 0 int g copyconstructcount 0 int g destructcount 0 struct a ...