我有一个类似性质的问题,例如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-value
和r-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/