右值引用还是左值?

Rvalue reference or lvalue?

我有一个 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 之间的差异引起的。前者是一个 value-category 只适用于 expressions,而后者是一个适用于 variables 的类型(技术上它需要成为某种类型的 r-value 引用,例如 r-value 对 int 的引用)。

因此,您显示的片段之间的差异实际上与 变量 类型 无关,而是 [= 表达式的31=]value-category。后缀 operator++ 要求操作数的 value-category 为 l-value,无论操作数的类型如何。

k++中,表达式k是一个l-value(大致来说是有名字的),也就是它的value-category。变量 ktype 是一个 r-value 引用,但没关系。

(static_cast<int&&>(3))++中,表达式static_cast<int&&>(3)是一个r-value(它没有名字),也就是它的value-category。不管 static_cast<int&&> 类型 (即 int),value-category 都是错误的,所以你得到一个错误。

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