修改右值参考值 - 它是如何工作的?

时间:2012-10-16 08:38:08

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

下面的代码编译并运行得很好。正当我以为我开始对rvalue引用和std :: forward进行了很好的掌握 - 这个非常简单的代码揭示了rvalue有一些非常基本的东西,我不明白。请澄清。

#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

我的主要问题是编译器在函数fn?

中存储'n'的位置

2 个答案:

答案 0 :(得分:4)

我可以在低层告诉我们这里发生了什么的一些细节。

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

  2. 临时地址传递给fn

  3. fn按地址写入43,更改临时值。

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

答案 1 :(得分:1)

取其地址,即&amp; n,您将看到其指针值。

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

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

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