auto &&做什么?

这是来自Scott Meyers的C ++ 11 Notes Sample的代码,

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应使types的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&&做什么?

代码是正确的。 auto&& p = expr表示auto&& p = expr的types是T&& ,其中T将从expr推断出来。 这里&&表示一个右值引用,例如

 auto&& p = 1; 

将推断T == int ,因此p的types是int&&

但是,引用可以按照规则折叠:

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

(此function用于在C ++ 11中实现完美转发。)

在这种情况下

 auto&& p = x; 

因为x是一个左值,右值引用不能绑定到它,但是如果我们推断T = int&那么p的types将变成int& && = int& ,这是一个左值引用,可以绑定到x 。 只有在这种情况下, auto&&auto&给出相同的结果。 这两个是不同的,例如

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

是不正确的,因为std::move(x)是一个右值,并且左值引用不能被绑定到它。

请阅读C ++ Rvalue References的解释 。