这是来自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
应该将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&&
做什么?
答案 0 :(得分: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;
由于x
是左值,右边距参考不能绑定到它,但如果我们推断T = int&
那么p
的类型将变为int& && = int&
,这是左值引用,可以绑定到x
。仅在这种情况下,auto&&
和auto&
会给出相同的结果。然而,这两者是不同的,例如
auto& p = std::move(x);
不正确,因为std::move(x)
是一个右值,左值参考不能绑定到它。
请阅读C++ Rvalue References Explained 了解情况。