當我們將乙個左值傳遞給右值引用引數時,且此右值引用指向模板型別引數(t&&)時,編譯器推斷模板型別引數為左值引用型別而非左值。
當我們間接建立乙個引用的引用,如型別別名或模板引數,則這些引用形成了摺疊:
因為有上述兩個規則,所以如果乙個函式引數是指向模板引數型別的右值引用,則可以傳遞給它任意型別的實參。如果將乙個左值傳遞給這樣的引數,則函式引數被例項化為了乙個普通的左值引用。
template
void
print1
(t&& value)
void
print2
(int
&& value)
intmain()
std::move可以獲得乙個繫結到左值上的右值引用,它除了利用右值引用和引用摺疊外,還利用了乙個規則:雖然不能隱式地將乙個左值轉換為右值引用,但是我們可以用static_cast顯式地將乙個左值轉換為乙個右值引用。
template
_nodiscard constexpr remove_reference_t<_ty>
&&move
(_ty&& _arg) noexcept
C 學習筆記 引用摺疊和模板右值引用引數
函式模板進行引數傳遞時,對引用的傳遞有兩個例外規則 引用摺疊只能應用於間接建立的引用的引用,如型別別名或者模板引數,我們不能直接建立引用的引用。template void fun t val 定義fun為模板函式,引數型別為 int i 0 fun i i是左值,實參將會被推斷為int int j ...
C 左值引用和右值引用
include include includeusing namespace std int f int main 左值引用表示乙個物件的身份,右值引用表示物件的值 返回左值引用的函式 賦值 下標 解引用和前置遞增遞減運算子都是返回左值。不能把右值引用繫結在它們上,但可以把左值引用綁在它們上 返回非...
C 左值引用和右值引用
這篇blog主要介紹一下左值和右值的概念及應用陷阱 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。引用是c 語法做的優化,...