【问题标题】:How does rvalue reference work here?右值引用如何在这里工作?
【发布时间】:2015-02-17 22:16:39
【问题描述】:

我对下面的代码感到困惑:

#include <iostream>

int main()
{
    int x{};

    int&& rvx = static_cast<int&&>(x);
    ++rvx;
    std::cout << x << std::endl;
}

它的输出是1。我不明白这是如何工作的。 static_cast 应该将左值 x 转换为 xvalue,然后将其分配给 rvx。为什么递增rvx 会导致x 发生变化?这是因为转换后的左值到右值本质上位于相同的内存位置,但现在它只是被认为是右值?我的印象是(这可能是错误的)演员不知何故从它的论点中创造了一个临时的。

【问题讨论】:

  • 我认为您对 lvaluervalue 的含义感到困惑。这些是描述表达的形容词。它们不是各种对象。
  • 整数没有内部状态,除了它的值(没有什么可移动的)。
  • @MattMcNabb 我的措辞有点草率,我知道对象总是左值(正如它们所命名的那样),但正如我所说的那样,给人的印象是 static_cast 会复制。跨度>
  • 不,对象不是左值。它们是物体。左值是表达式的一个类别。
  • @vsoftco 对象是内存区域。还有一些关于对象类型的信息,但重要的部分是内存区域。没有关于如何访问该内存的概念。它可以通过一个变量,也可以通过任何其他表达式。成功调用 malloc() 的结果指向一个对象或一系列对象,即使没有引用这些对象的变量。

标签: c++ c++11 rvalue-reference lvalue-to-rvalue


【解决方案1】:

右值引用是一个引用。在这方面,它就像任何其他参考一样工作。

【讨论】:

    【解决方案2】:

    一个右值引用可以绑定到一个临时的。这就是你会得到的,例如,如果你写

    int x{};
    int&& rvx = +x;
    

    但它并不需要绑定到一个临时的。通过将x 转换为int&amp;&amp;,您已经向编译器表明这也可以,它可以将x 视为右值以直接绑定到引用。

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2015-06-08
      • 2018-03-18
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多