C++ 右值到左值的转换和;命名的引用是左值;规则

C++ 右值到左值的转换和;命名的引用是左值;规则,c++,c++11,rvalue-reference,C++,C++11,Rvalue Reference,有很多与右值相关的问题,但我没有找到这些确切问题的答案 我不能用“命名引用是左值引用”的经验法则来概括我的想法 这看起来真的很奇怪——我们将引用声明为右值,但由于我们必须以某种方式使用此引用(否则,有什么意义?),我们将其命名,因为它被命名为左值 考虑以下代码: int&& foo(int&& arg) { arg = 10; return arg; // ERROR, `arg` is an lvalue since it's named! }

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

我不能用“命名引用是左值引用”的经验法则来概括我的想法

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

考虑以下代码:

int&& foo(int&& arg)
{
    arg = 10;
    return arg; // ERROR, `arg` is an lvalue since it's named!
}
foo(1);
问题是:

  • arg究竟何时变成左值
  • 如果函数为void且b)和c)行不存在,则arg的类型是什么
  • 很多文章(只是引用了第一次发现)说可能存在隐式的左值到右值的转换,但不可能有相反的方向——为什么?此示例显示,
    arg
    -s从
    int&
    转换为
    int&
    ,然后尝试隐式地将
    int&
    转换为
    int&
    ,这会导致编译错误——正好相反的行为!这就是为什么我们需要
    std::move
    ,它基本上是对右值类型的显式静态转换

  • arg
    变量具有类型
    int&
    和无值类别

    arg
    表达式(第3行和第4行的表达式)具有类型
    int
    和值类别“左值”

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


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

    arg
    变量具有type
    int&</code>且无值类别

    arg
    表达式(第3行和第4行的表达式)具有类型
    int
    和值类别“左值”

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

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

    “命名引用是左值引用”,值类别是表达式的属性,而不是变量/引用/etc“命名引用是左值引用”,值类别是表达式的属性,而不是变量/引用等