簡體   English   中英

普通右值引用和std :: forward返回的引用之間有什么區別?

[英]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

std::forward返回的引用與int&&q不同之處是什么?

他們的價值觀類別不同。 請注意,類型和值類別是不同的東西。

q是一個命名變量,它被限定為左值 ,因此它不能綁定到右值引用。

(強調我的)

變量的名稱,函數,模板參數對象(自C ++ 20以來)或數據成員,無論類型如何,例如std::cinstd::endl 即使變量的類型是右值引用,由其名稱組成的表達式也是左值表達式;

雖然從函數返回的rvalue引用被限定為xvalue ,它屬於rvalue

函數調用或重載的運算符表達式,其返回類型是對象的右值引用,例如std::move(x) ;

表達式qstd::forward<int>(q)之間的區別在於前者是左值,而后者是左值(基本類別xvalue)。

我在這個答案中解決了類似的問題:關鍵是q作為一個表達式是一個左值 ,因為它有一個名字。 std::forward<int>(q) (或等價的std::move(q) )是沒有名稱的表達式,因為它們返回(未命名的)右值引用,它們是xvalues,它是一個子類別rvalue因此可以綁定到右值引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM