【问题标题】:Rvalue reference or lvalue?右值参考还是左值?
【发布时间】:2020-09-27 13:25:25
【问题描述】:

我有一个与 5 年前发布的类似性质的问题: Why are rvalues references variables not rvalue?

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

int&& k = 3;
k++;

但我不能这样做:

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

我一直将右值引用解释为左值,因为右值引用变量是左值。但显然情况并非如此。有人可以向我解释为什么 (static_cast&lt;int&amp;&amp;&gt;(3))++; 会导致 using rvalue as lvalue 吗?

【问题讨论】:

    标签: c++ rvalue-reference


    【解决方案1】:

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

    所以你显示的sn-ps之间的区别实际上与变量type无关,而是value-category 表达式的em>。后缀operator++ 要求操作数的值类别是左值,无论操作数的类型如何。

    k++中,表达式k是一个左值(粗略地说,它有一个名字),也就是它的值类别。变量 ktype 是一个 r 值引用,但这没关系。

    (static_cast&lt;int&amp;&amp;&gt;(3))++ 中,表达式static_cast&lt;int&amp;&amp;&gt;(3) 是一个右值(它没有名称),它是它的值类别。不管static_cast&lt;int&amp;&amp;&gt;(即int)的type是什么,value-category都是错误的,所以你会得到一个错误。

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

    【讨论】:

    • 我认为重要的是要注意表达式不能有引用类型。 变量 k 的类型是int &amp;&amp;,但表达式 k 的类型只是int(并且该表达式是一个左值)。这也意味着static_cast&lt;int&amp;&amp;&gt;(3)的类型是int而不是int &amp;&amp;
    • 对于任何想了解更多的人:不错的阅读:en.cppreference.com/w/cpp/language/value_category
    • @HolyBlackCat 好的,改写了一点。现在应该清楚了。
    • @cigien 看起来不错。我会在那里留下我的评论,因为“表达式不能有引用类型”是我第一次学习它时点击它的原因。
    • @cigien 我对“它没有名称,所以它是右值”参数有点困惑。为什么 (static_cast&lt;int&amp;&gt;(k))++k 是一些 int 变量的情况下工作?我知道该表达式返回对 k 的引用,并且引用被定义为对象的另一个名称,但是 static_cast&lt;int&amp;&gt;static_cast&lt;int&amp;&amp;&gt; 之间有什么区别?两者都返回参考,对吗?总结一下,为什么static_cast&lt;int&amp;&gt;这个表达式有名字?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多