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

Dim*_*imG 2 c++ rvalue-reference c++11

有很多与右值相关的问题,但我没有找到这些确切问题的答案。

我无法完全理解“命名引用是左值引用”的经验法则。

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

考虑这段代码:

int&& foo(int&& arg)
{
    arg = 10;
    return arg; // ERROR, `arg` is an lvalue since it's named!
}
foo(1);
Run Code Online (Sandbox Code Playgroud)

问题是:

  1. arg 到底什么时候变成左值?
  2. 如果函数为 void 并且 b) 和 c) 行不存在,则 arg 的类型是什么?
  3. 很多文章(仅引用第一个找到的结果)说可能存在隐式左值到右值的转换,但相反的方向是不可能的 - 为什么?此示例显示-s 从toarg转换,然后尝试隐式转换为which 导致编译错误 - 只是相反的行为!这就是为什么我们需要它基本上是一个显式的 static_cast 到右值类型。int&&int&int&int&&std::move

Cub*_*bbi 5

arg该变量有类型int&&但没有值类别。

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

左值到右值的转换会更改表达式的值类别,但不会更改其类型。arg+1如果您在函数内部编写, argtype 的左值表达式int将经历此转换以生成 type 的纯右值表达式int,因为这是built-in+所需要的。

int& 和 int&& 之间不存在“左值到右值”或反向转换,因为表达式从来没有引用类型。程序中的错误是无法将右值引用(类型为 int&&)绑定到左值表达式(类型为int)。