【问题标题】:Why can i assign a value to a rvalue reference?为什么我可以为右值引用赋值?
【发布时间】:2021-01-03 17:22:00
【问题描述】:

我最近开始学习右值、左值、移动语义,但我无法理解诸如右值引用之类的一些概念。为什么我可以为右值引用分配一个值,例如:int&& x = 10;.. 这不意味着右值引用是左值(我认为右值引用是右值)?如果这是真的......拥有右值引用有什么意义?如果那是假的,那么右值 ref 和左值有什么区别?

【问题讨论】:

  • 这是初始化,您最初将引用绑定到一个临时对象,从而延长后者的生命周期。
  • 哦,我刚刚测试了一些东西:如果我有一个带有参数的函数 -> rvalue ref ... 该函数只需要 rvalues .. 如果我尝试给它一个简单的变量,它会给出一个错误
  • @Robert 是的,这是一个更好的用例。你甚至可以创建两个重载函数,一个接受左值引用,一个接受右值引用。然后它开始变得非常有用,因为您知道何时可以移动以及何时需要复制。
  • @Robert 一个变量本身就是一个左值,不管它的类型。您需要明确地std::move 它。 @rustyx cppreference.org 就足够了。

标签: c++ move-semantics rvalue lvalue


【解决方案1】:

为什么我可以为右值引用赋值,例如:int&& x = 10

这不是任务。那就是初始化。在这里,一个临时对象是从整数常量实现的,并且引用绑定到该临时对象。对 const 的左值引用也可以做同样的事情:const int& x = 10。它不能通过对非 const 的左值引用来完成,因为它们不能绑定到右值。

这是否意味着右值 ref 是左值

只有表达式才有值。 int&& x = 10; 是声明而不是表达式。因此,声明一开始就没有价值。

声明包含一个表达式10,它是一个prvalue。

类型也不是表达式,所以“rvalue reference is an lvalue”是没有意义的。

变量也没有值类别。但是 id-expressions - 只是命名变量的表达式 - 确实具有值类别。无论命名变量的类型如何,它们都是左值 - 是的,即使类型是右值引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多