36

这是 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应该使 type of a1asint&

引用代码中的哪个似乎是错误的。

我写了这个小代码,并在 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

1 回答 1

44

代码是对的。auto&& p = expr表示 的 类型p是从T&&哪里T推断出来的expr。这里&&表示一个右值引用,例如

auto&& p = 1;

将推断T == int,因此类型pis 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了解一下。

于 2012-02-06T15:56:11.330 回答