我有一个类似性质的问题,就像 5 年前发布的问题一样: 为什么右值引用变量不是右值?
我主要关心的是为什么我可以这样做:
int&& k = 3;
k++;
但我不能这样做:
(static_cast<int&&>(3))++;
我总是将右值引用解释为左值,因为右值引用变量是左值。但显然事实并非如此。有人可以向我解释为什么
(static_cast<int&&>(3))++;
结果是 using rvalue as lvalue
吗?
混乱可能是由于
r-value
和 r-value reference
之间的差异引起的。前者是仅适用于表达式的值类别,而后者是适用于变量的类型(从技术上讲,它需要是某种类型的右值引用,例如对 int 的右值引用) ).
因此,您显示的片段之间的差异实际上与变量的类型无关,而是与表达式的值类别相关。 Postfix
operator++
要求操作数的值类别为左值,无论操作数的类型如何。
在
k++
中,表达式k
是一个左值(粗略地说,它有一个名称),这是它的值类别。变量 k
的 type是 r 值引用,但这很好。
在
(static_cast<int&&>(3))++
中,表达式 static_cast<int&&>(3)
是一个 r 值(它没有名称),这是它的值类别。无论 static_cast<int&&>
的 type(即
int
)如何,值类别都是错误的,因此您会收到错误。
请注意,错误消息
using rvalue as lvalue
指的是正在使用的表达式的值类别。它与变量的类型无关。