我有一个类似性质的问题,例如5年前发布的一个问题:
Why are rvalues references variables not rvalue?
我主要关心的是为什么我可以这样做:

int&& k = 3;
k++;
但我不能这样做:
(static_cast<int&&>(3))++;
我一直将右值引用解释为左值,因为右值引用变量是左值。但是显然不是这样。有人可以向我解释为什么(static_cast<int&&>(3))++;产生using rvalue as lvalue吗?

最佳答案

混淆可能是由于r-valuer-value reference之间的差异引起的。前者是仅适用于表达式的值类别,而后者是适用于变量的类型(从技术上讲,它需要是某种类型的r值引用,例如,对int的r值引用)。
因此,您所显示的代码片段之间的差异实际上与变量的类型无关,而与表达式的值类别有关。后缀operator++要求操作数的值类别为l值,而不管操作数的类型如何。
k++中,表达式k是一个l值(大致来说,它有一个名称),这是它的值类别。变量k的类型是一个r值引用,但这很好。
(static_cast<int&&>(3))++中,表达式static_cast<int&&>(3)是一个r值(它没有名称),这是它的值类别。无论static_cast<int&&>的类型如何(即int),值类别都是错误的,因此会出现错误。
请注意,错误消息using rvalue as lvalue指的是正在使用的表达式的值类别。它与变量的类型无关。

关于c++ - 右值引用还是左值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64088934/

10-12 20:33