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
-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
变量具有typeint&</code>且无值类别
arg
表达式(第3行和第4行的表达式)具有类型int
和值类别“左值”
左值到右值的转换更改表达式的值类别,而不更改其类型。如果在函数中写入arg+1
,则int
类型的左值表达式arg
将进行此转换以生成int
类型的prvalue表达式,因为这是内置的+
所需要的
int&和int&之间没有“从左值到右值”或反向转换,因为表达式从来没有引用类型。程序中的错误是未能将右值引用(int&&&类型)绑定到左值表达式(int
类型)。“命名引用是左值引用”,值类别是表达式的属性,而不是变量/引用/etc“命名引用是左值引用”,值类别是表达式的属性,而不是变量/引用等