右值引用还是左值?

ken*_*kar 8 c++ rvalue-reference

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

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

int&& k = 3;
k++;
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

(static_cast<int&&>(3))++;
Run Code Online (Sandbox Code Playgroud)

我总是将右值引用解释为左值,因为右值引用变量是左值。但显然情况并非如此。有人可以向我解释为什么(static_cast<int&&>(3))++;结果是using rvalue as lvalue

cig*_*ien 7

混淆可能是由r-value和之间的差异引起的r-value reference。前者是仅适用于表达式的值类别,而后者是适用于变量的类型(从技术上讲,它需要是某种类型的 r 值引用,例如对 int 的 r 值引用)。

所以,你已经证明是不实际涉及到的片段之间的差别类型的的变量,但价值类别中的表达。Postfixoperator++要求操作数的值类别为左值,而不管操作数的类型如何。

在 中k++,表达式k是一个左值(粗略地说,它有一个名称),这是它的值类别。变量的类型k是 r 值引用,但这很好。

在 中(static_cast<int&&>(3))++,表达式static_cast<int&&>(3)是一个 r 值(它没有名称),这是它的值类别。不管的类型static_cast<int&&>(这是int),值类是错误的,那么你会得到一个错误。

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

  • 我认为重要的是要注意表达式不能具有引用类型。**变量** `k` 的类型是 `int &amp;&amp;`,但 **表达式** `k` 的类型只是 `int`(并且该表达式是一个左值)。这也意味着`static_cast&lt;int&amp;&amp;&gt;(3)`的类型是`int`而不是`int &amp;&amp;`。 (2认同)
  • @cigien 看起来不错。我将在那里留下我的评论,因为“表达式不能有引用类型”是我第一次学习它时让我感兴趣的原因。 (2认同)