有很多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);
问题是:
arg
已从int&&
转换为int&
,然后尝试将int&
隐式转换为int&&
,这会导致编译错误 - 恰恰相反行为!这就是为什么我们需要std::move
基本上是一个显式的static_cast到rvalue类型。答案 0 :(得分:3)
arg
变量的类型为int&&
,没有值类别。
arg
表达式(它是第3行和第4行的表达式)的类型为int
,值类别为“左值”
左值到右值转换会更改表达式的值类别,而不会更改其类型。如果在函数内部写arg+1
,则arg
类型的左值表达式int
将进行此转换以生成类型为int
的prvalue表达式,因为这是内置的+
要求。
没有“右值左值”或反转转换为int&和int&&因为表达式从不具有引用类型。程序中的错误是绑定左值引用(类型为int&&)到左值表达式(类型int
)。