2017-07-16 54 views
3

我想知道我的假設是否正確 - > Rvalue引用的工作方式與左值引用一樣,只是它們只能綁定到右值,因此可以用於檢測右值。左值引用是否像左值引用一樣工作?

所以當用作返回類型時,它就像左值引用一樣工作,就像它們返回它們綁定的實際對象一樣。

當用作參數類型時,它們傳遞值而不進行任何複製。我看到很多人問是什麼區別是通過右值引用和值(和左值引用)返回之間的區別是什麼,但不能通過說右值引用像左值引用一樣工作來回答,所以如果你知道在使用左值引用時會發生什麼,你可能知道使用右值引用時會發生什麼,也就是說,你會知道通過右值引用返回實際對象,而通過值返回時返回副本,就像通過左值引用返回和按價值(粗略)?

還是我錯了?

+1

我認爲這是一個很好的摘要。 – Quentin

+0

如果你意識到將一個引用(左值或右值)返回給本地(堆棧)變量將返回一個懸空引用,導致未定義的行爲,我不清楚。 –

+0

返回一個r值參考可以防止RVO,因此是一個悲觀(以及潛在的危險) –

回答

1

當任何命名對象被寫入時,它被視爲它的真實類型。

當讀取任何對象時,它將被視爲一個l值引用。

從函數返回的對象沒有名稱,因此將其視爲其實際類型。

其他一切都源於此。

+0

「真實類型」是什麼意思? –

+0

@FacPam我的意思是在聲明中提到的類型。例如。 X,X&或X &&。當任何這些類型的任何名稱被讀取時,這是一個X& –

-1

就使用右值引用作爲返回類型而言,它通常與左值引用相似,即您通常不應該這樣做,因爲您無法返回對局部變量的引用。然而,在輸入和輸出rvalue引用的組合使得一些有趣的事情:

Matrix operator+(const Matrix& lhs, const Matrix& rhs) { 
    auto r = lhs; 
    r += rhs; 
    return r; 
} 

一些矩陣加法函數的典型簽名。但利用右值引用,我們就可以開始添加過載是這樣的:

Matrix&& operator+(Matrix&& lhs, const Matrix& rhs) { 
    lhs += rhs; 
    return lhs; 
} 

第二個版本是整齊的,因爲沒有副本,甚至沒有任何動作!這對於左值引用來說是不可行的,因爲你不能確定你可以繼續使用/濫用輸入的存儲。因此,右值引用確實爲參考返回了一些新的機會,但它仍然是一個例外而非常規。

+0

如果我們沒有複製elision,這將是很酷的,但我們確實是這樣。所以這完全沒有必要。在這種情況下,我們應該傳遞並返回副本。 –

+0

我不能對17說話,但是在14和之前返回副本並不總是有相同的效果。例如,當您將多個函數調用鏈接在一起時,複製elision往往只能工作一層。 –

+0

從C++ 17開始,copy elision是強制性的。 –

相關問題