2012-02-06 119 views
35

這是由Scott Meyers的C++ 11注示例代碼,auto &&做什麼?

int x; 
auto&& a1 = x;    // x is lvalue, so type of a1 is int& 
auto&& a2 = std::move(x); // std::move(x) is rvalue, so type of a2 is int&& 
我無法理解 auto&&


我有auto一定的瞭解,從中我會說,auto& a1 = x應的a1類型int&

從引用代碼,似乎是錯誤的。

我寫了這個小代碼,並在gcc下運行。

#include <iostream> 

using namespace std; 

int main() 
{ 
    int x = 4; 
    auto& a1 = x;   //line 8 
    cout << a1 << endl; 
    ++a1; 
    cout << x; 
    return 0; 
} 

輸出= 4 (newline) 5
然後我修改線8 auto&& a1 = x;,跑。相同的輸出。

我的問題:是auto&等於auto&&
如果它們不同,auto&&做什麼?

+4

如果rhs是一個左值,我認爲'auto&'和'auto &&'是等價的。如果rhs是一個右值,'auto&'會給你一個錯誤。 – balki 2012-02-06 15:52:46

+0

[左值引用和右值引用相似](http://msdn.microsoft.com/en-us/library/f90831hc.aspx) – AJG85 2012-02-06 15:54:15

+4

'auto &&'變量與函數模板中的T &&參數相同。 – fredoverflow 2012-02-06 17:13:46

回答

43

代碼是正確的。 auto&& p = expr表示p的類型是T&&,其中T將從expr推斷出。這裏的&&指示右值引用,例如,

auto&& p = 1; 

將推斷T == int並且因此p類型是int&&

然而,引用可以根據該規則被摺疊:

T& & == T& 
T& && == T& 
T&& & == T& 
T&& && == T&& 

(其功能是用於實現在C++ 11完美轉發)

在這種情況下

auto&& p = x; 

as x是一個左值,右值引用不能綁定到它,但如果我們推斷T = int&那麼p的類型將成爲我int& && = int&,這是一個左值參考,可以綁定到x。只有在這種情況下,auto&&auto&纔會得出相同的結果。儘管這兩者是不同的,例如

auto& p = std::move(x); 

不正確,因爲std::move(x)是一個右值,並且左值參考不能被綁定到它。

請閱讀C++ Rvalue References Explained散步。

+0

CppNext列出了相同的規則:http://cpp-next.com/archive/2009/12/onward-forward/ – Nawaz 2012-02-06 15:58:45

+0

謝謝!爲解釋。關於Rvalue的鏈接也很有幫助。 – 2012-02-06 16:15:34