[英]What's the difference between an ordinary rvalue reference and one returned by std::forward?
我不能這樣做:
int &&q = 7;
int &&r = q;
//Error Message:
//cannot convert from 'int' to 'int &&'
//You cannot bind an lvalue to an rvalue reference
如果我理解正確,在初始化右值引用時,也會初始化一個臨時變量。 所以int &&q = 7;
可以認為是:
int temp = 7;
int &&q = temp;
當在右側使用參考時,我實際上是在使用裁判。 所以int &&r = q;
可以認為是:
int &&r = temp; //bind an lvalue to an rvalue reference, cause error, understandable
所以上面是我理解編譯器錯誤發生的方式。
為什么添加std::forward
可以解決這個問題?
int &&q = 7;
int &&r = std::forward<int>(q);
我知道std::forward
總是返回右值的參考,如何參考由歸國std::forward
來自不同int&&q
?
表達式q
和std::forward<int>(q)
之間的區別在於前者是左值,而后者是左值(基本類別xvalue)。
我在這個答案中解決了類似的問題:關鍵是q
作為一個表達式是一個左值 ,因為它有一個名字。 std::forward<int>(q)
(或等價的std::move(q)
)是沒有名稱的表達式,因為它們返回(未命名的)右值引用,它們是xvalues,它是一個子類別rvalue因此可以綁定到右值引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.