ken*_*kar 8 c++ rvalue-reference
我有一个类似 5 年前发布的类似性质的问题: 为什么右值引用变量不是右值?
我主要关心的是为什么我可以这样做:
int&& k = 3;
k++;
Run Code Online (Sandbox Code Playgroud)
但我不能这样做:
(static_cast<int&&>(3))++;
Run Code Online (Sandbox Code Playgroud)
我总是将右值引用解释为左值,因为右值引用变量是左值。但显然情况并非如此。有人可以向我解释为什么(static_cast<int&&>(3))++;结果是using rvalue as lvalue?
混淆可能是由r-value和之间的差异引起的r-value reference。前者是仅适用于表达式的值类别,而后者是适用于变量的类型(从技术上讲,它需要是某种类型的 r 值引用,例如对 int 的 r 值引用)。
所以,你已经证明是不实际涉及到的片段之间的差别类型的的变量,但价值类别中的表达。Postfixoperator++要求操作数的值类别为左值,而不管操作数的类型如何。
在 中k++,表达式k是一个左值(粗略地说,它有一个名称),这是它的值类别。变量的类型k是 r 值引用,但这很好。
在 中(static_cast<int&&>(3))++,表达式static_cast<int&&>(3)是一个 r 值(它没有名称),这是它的值类别。不管的类型的static_cast<int&&>(这是int),值类是错误的,那么你会得到一个错误。
请注意,错误消息using rvalue as lvalue是指正在使用的表达式的值类别。它与变量的类型无关。