【问题标题】:What does auto&& do?auto&& 是做什么的?
【发布时间】:2012-02-28 02:05:29
【问题描述】:

这是来自 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&amp;&amp; a1 = x;,然后运行。相同的输出。

我的问题:auto&amp; 是否等于 auto&amp;&amp;
如果它们不同,auto&amp;&amp; 会做什么?

【问题讨论】:

  • 如果 rhs 是左值,我认为 auto&amp;auto&amp;&amp; 是等价的。如果 rhs 是右值,auto&amp; 会给你一个错误。
  • auto&amp;&amp; 变量与函数模板中的T&amp;&amp; 参数含义相同。

标签: c++ c++11 auto


【解决方案1】:

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

auto&& p = 1;

会推断出T == int,因此p的类型是int&amp;&amp;

但是,引用可以根据规则折叠:

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

(该特性用于在C++11中实现完美转发。)

在这种情况下

auto&& p = x;

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

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

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

请阅读C++ Rvalue References Explained 了解一下。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2020-07-03
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
相关资源
最近更新 更多