右值参考还是左值?

问题描述 投票:0回答:2

我有一个类似性质的问题,就像 5 年前发布的问题一样: 为什么右值引用变量不是右值?

我主要关心的是为什么我可以这样做:

int&& k = 3;
k++;

但我不能这样做:

(static_cast<int&&>(3))++;

我总是将右值引用解释为左值,因为右值引用变量是左值。但显然事实并非如此。有人可以向我解释为什么

(static_cast<int&&>(3))++;
结果是
using rvalue as lvalue
吗?

c++ rvalue-reference
2个回答
10
投票

混乱可能是由于

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
指的是正在使用的表达式的值类别。它与变量的类型无关。


0
投票

因为右值引用变量是左值

根据cppreference

左值 即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式(但请参阅符合移动条件的表达式);

© www.soinside.com 2019 - 2024. All rights reserved.