2013-10-25 24 views
2
int n = 1; 
double&& rref = n; 

在什麼樣的情況下做我們需要初始化一個右值可變,給出C++ 11:右值引用初始化有什麼用?

  • 我們可以通過移動投值右值
  • 命名變量是左值

編輯:

我改變了一倍& &,使其編譯示例。在我看來,這個問題依然存在,甚至更加相關。

一些背景知識,我在cppreference上讀到:「右值可能用於初始化右值引用,在這種情況下,右值標識的對象的生命週期會延長,直到引用的範圍結束。我不太明白這個說法的重點。無論它是否是右值,我們都必須決定是否延長變量的生命期,可能是從另一個函數返回的?

+0

有沒有這樣的事情作爲* rvalue變量*。 * rvalue *是*表達式*的值類別。類型* rvalue引用*的變量必須在其定義中初始化,如類似*左值引用*的變量。 – dyp

+0

您可以使用右值引用變量來綁定不可複製,不可移動類型的臨時變量。例如。 'struct ncm {ncm(ncm const&)= delete; NCM(NCM &&)=刪除; }; ncm foo(){return {}; } ncm && var = foo();' – dyp

+0

N.B.原始代碼是'int && rref = n;',這是不合格的,因爲'n'是一個左值,因此不能綁定到右值引用。新版本爲'int'->'double'轉換創建了一個'double'類型的臨時類型,並將該臨時類型綁定到右值ref(格式良好)。 – dyp

回答

5

您應該避免使用右值引用。

我想不出真的理由使用本地右值引用。我能想象一個用例:在同一時間延長一個臨時而壽命允許其讀寫訪問(類似於結合到const T&,但沒有const限制):

T f(); 
T && r = f(); 
// can use 'r' here for const/non-const access 

雖然在本簡單的情況下,你可以爭辯說,使用一個值是一個更好的選擇,有些情況下,f()返回的確切類型不知道,但你知道它是從一個基礎派生的,在這種情況下,你可以使用上面的技巧來延長使用壽命:

template <typename T> 
Derived<T> f(T const &); // Derived<T> extends Base 

Base && r = f(1);   // Extends lifetime 

但即使在那個具體的用例中,在C++ 1 1有更好的工具,像auto

auto r = f(1); 

,這將創造由f返回的具體類型的局部變量。所以它確實沒有啓用任何功能。

當右值引用是很重要的是作爲函數的參數,當你需要從左值分化右值。如果這兩種情況下的行爲都是相同的(即您將複製),那麼只需通過值獲取參數。

引述埃裏克Niebler最近的鳴叫:

您應該害怕右值裁判就像一個可能是敬畏神的。它們功能強大,但對它們的要求越少越好

+0

Base和&r是一個x值嗎? –

+0

@CandyChiu:不,這是一個左翼。奇怪的是,右值引用是一個左值,它只是綁定到右值。那麼,引用永遠不會是?值,使用引用的表達式是。 –

+0

xvalue是一個同時存在的右值和glvalue,所以r對我來說看起來像一個。這是令人困惑的,更好地注意Eric的建議。 –

1

我知道,只有鏈接到沒有通過複製粘貼相關部分的版權才能鏈接到文章是可恥的,但this article解釋了爲什麼&&可以用作「通用參考」。

總之,寫

auto&& //... 

確保最大無憂的煩躁,獨立auto代表這裏的類型。

+4

通用引用僅適用於模板,問題在任何地方都沒有模板。您可能希望將這些信息添加爲評論,但這不是一個答案。 –

+0

*確保最大的無憂無慮*是否?作爲一個局部變量,它本身如何比'auto'好? –

+0

@DavidRodríguez-dribeas:它們適用於推導類型,其中包括'auto'以及模板。 –