函式模板進行引數傳遞時,對引用的傳遞有兩個例外規則:
引用摺疊只能應用於間接建立的引用的引用,如型別別名或者模板引數,我們不能直接建立引用的引用。
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 ...