Rvalue到左值转换和“named-refs-are-lvalues”规则

时间:2016-05-25 10:13:12

标签: c++11 rvalue-reference

有很多rvalue相关的静止,但我没有找到这些确切问题的答案。

我无法围绕“命名参考是左值参考”的经验法则。

看起来真的很奇怪 - 我们将引用声明为 rvalue 但是因为我们必须以某种方式使用这个引用(否则,重点是什么?),我们命名它,因为它被命名为它是一个左值毕竟!

考虑以下代码:

1 int&& foo(int&& arg)
2 {
3     arg = 10;
4     return arg; // ERROR, `arg` is an lvalue since it's named!
5 }
6 foo(1);

问题是:

  1. 什么时候arg成为左值?
  2. 如果函数无效且b)和c)行不存在,arg的类型是什么?
  3. 很多文章(仅引用首次发现的result)表示rvalue转换可能存在隐式左值,但相反的方向是不可能的 - 为什么?此示例显示arg已从int&&转换为int&,然后尝试将int&隐式转换为int&&,这会导致编译错误 - 恰恰相反行为!这就是为什么我们需要std::move基本上是一个显式的static_cast到rvalue类型。

1 个答案:

答案 0 :(得分:3)

arg变量的类型为int&&,没有值类别。

arg表达式(它是第3行和第4行的表达式)的类型为int,值类别为“左值”

左值到右值转换会更改表达式的值类别,而不会更改其类型。如果在函数内部写arg+1,则arg类型的左值表达式int将进行此转换以生成类型为int的prvalue表达式,因为这是内置的+要求。

没有“右值左值”或反转转换为int&和int&&因为表达式从不具有引用类型。程序中的错误是绑定左值引用(类型为int&&)到左值表达式(类型int)。