右值参考还是左值?

问题描述

我有一个类似性质的问题,就像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 type 是一个r值引用,但这很好。

(static_cast<int&&>(3))++中,表达式static_cast<int&&>(3)是一个r值(没有名称),这是它的值类别。不管static_cast<int&&>(是int)的类型,值类别都是错误的,因此会出现错误。

请注意,错误消息using rvalue as lvalue指的是正在使用的表达式的值类别。它与变量的类型无关。