什么是汽车&&做?

时间:2012-02-06 15:48:12

标签: c++ c++11 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应该将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&&做什么?

1 个答案:

答案 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 了解情况。