右值引用还是左值?
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-value
和 r-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。变量 k
的 type 是一个 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。与变量类型无关
我有一个 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
之间的差异引起的。前者是一个 value-category 只适用于 expressions,而后者是一个适用于 variables 的类型(技术上它需要成为某种类型的 r-value 引用,例如 r-value 对 int 的引用)。
因此,您显示的片段之间的差异实际上与 变量 的 类型 无关,而是 [= 表达式的31=]value-category。后缀 operator++
要求操作数的 value-category 为 l-value,无论操作数的类型如何。
在k++
中,表达式k
是一个l-value(大致来说是有名字的),也就是它的value-category。变量 k
的 type 是一个 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。与变量类型无关