1. 程式人生 > >引用摺疊和右值引用引數

引用摺疊和右值引用引數

通常我們不能將一個右值引用繫結到一個左值上。但是,C++語言在正常的繫結規則之外定義了兩個例外規則:
第一個例外規則影響右值引用引數的推斷如何進行。當我們將一個左值傳遞給函式的右值引用引數,且此右值引用指向模板型別引數(如T&&)時,編譯器推斷模板型別引數為實參的左值引用型別。
第二個例外繫結規則:如果我們間接建立一個引用的引用,則這些引用形成了“摺疊”。在所有情況下(除了一個例外),引用會摺疊成一個普通的左值型別。在新標準中,摺疊規則擴充套件到右值引用。只在一種特殊情況下引用會摺疊成右值引用:右值引用的右值引用。即對於一個給定型別X:
1。X& &、X& &&和X&& &都摺疊成型別X&。


2。型別X&& &&摺疊成X&&。
這兩個規則導致了兩個重要結果:
1。如果一個函式引數是一個指向模板型別引數的右值引用(如T&&),則它可以被繫結到一個左值;且
2。如果實參是一個左值,則推斷出的模板實參型別將是一個左值引用,且函式引數將被例項化為一個(普通)左值引用引數(T&)。
另外值得注意的是,這兩個規則暗示我們:可以將任意型別的實參傳遞給T&&型別的函式引數。

在實際中,右值引用通常用於兩種情況:模板轉發其實參或模板被過載。