您應該避免使用右值引用。
我想不出真的好理由使用本地右值引用。我能想象一個用例:在同一時間延長一個臨時而壽命允許其讀寫訪問(類似於結合到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最近的鳴叫:
您應該害怕右值裁判就像一個可能是敬畏神的。它們功能強大,但對它們的要求越少越好
有沒有這樣的事情作爲* rvalue變量*。 * rvalue *是*表達式*的值類別。類型* rvalue引用*的變量必須在其定義中初始化,如類似*左值引用*的變量。 – dyp
您可以使用右值引用變量來綁定不可複製,不可移動類型的臨時變量。例如。 'struct ncm {ncm(ncm const&)= delete; NCM(NCM &&)=刪除; }; ncm foo(){return {}; } ncm && var = foo();' – dyp
N.B.原始代碼是'int && rref = n;',這是不合格的,因爲'n'是一個左值,因此不能綁定到右值引用。新版本爲'int'->'double'轉換創建了一個'double'類型的臨時類型,並將該臨時類型綁定到右值ref(格式良好)。 – dyp