【问题标题】:modifying the value of rvalue reference - How does it work?修改右值引用的值 - 它是如何工作的?
【发布时间】:2012-10-16 08:38:08
【问题描述】:

下面的代码编译并运行得很好。就在我认为我开始对右值引用和 std::forward 有了不错的掌握时 - 这个非常简单的代码揭示了我不理解的关于右值的一些非常基本的东西。请澄清。

#include <iostream>
#include <iomanip>
using namespace std;

void fn( int&& n )
{
    cout << "n=" << n << endl;
    n = 43;
    cout << "n=" << n << endl;
}


int main( )
{
    fn( 42 );
}

我用 g++ 4.7 用下面的命令行编译它:
g++ --std=c++11 test.cpp

输出是:
n=42
n=43

我的主要问题是编译器将“n”存储在函数 fn 中的什么位置?

【问题讨论】:

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


    【解决方案1】:

    我可以详细说明这里发生的低级情况。

    1. 在堆栈上创建了一个int 类型的临时变量 main。它被赋值为 42。

    2. 临时地址传给fn

    3. fn 通过该地址写入 43,从而更改临时值。

    4. 函数退出,临时函数在涉及调用的完整表达式结束时终止。

    【讨论】:

    • "函数退出,临时死掉。" ——从某种意义上说,这是两个独立的步骤。在这个例子中,函数调用是包含临时函数的完整表达式的最外层部分,但如果表达式类似于fn(42), fn(43), fn(44);,那么名义上这三个临时函数不会被销毁,直到所有三个函数调用都完成。跨度>
    【解决方案2】:

    获取它的地址,即&n,你会看到它的指针值。

    您可以将一个局部变量粘贴到您的函数中,也可以在 main 中,并获取它们的地址并查看它在哪里,但是依赖它们之间的任何比较都是未定义的行为。

    int 不是 const 是正确的,你的函数会获取它。以同样的方式,您可以使用 r 值引用初始化具有集合的类,然后类可以稍后修改它,即它不必是 const 成员。但是不会有副本。

    按照标准,被“移动”的对象将处于稳定、可用的状态,但它所持有的实际值是未定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-04
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      相关资源
      最近更新 更多