2012-02-06 597 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