问题描述
我有一个类似性质的问题,就像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
的 type 是一个r值引用,但这很好。
在(static_cast<int&&>(3))++
中,表达式static_cast<int&&>(3)
是一个r值(没有名称),这是它的值类别。不管static_cast<int&&>
(是int
)的类型,值类别都是错误的,因此会出现错误。
请注意,错误消息using rvalue as lvalue
指的是正在使用的表达式的值类别。它与变量的类型无关。