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的解释 。