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

Uri*_*Uri 12 c++ rvalue-reference c++11

下面的代码编译并运行得很好.正当我以为我开始对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 );
}
Run Code Online (Sandbox Code Playgroud)

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

输出为:
n = 42
n = 43

我的主要问题是编译器在函数fn中存储'n'的位置?

And*_*rey 6

我可以告诉一些细节,这里发生在低层次上的事情。

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

  2. 临时地址被传递给fn.

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

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

  • “函数退出,临时死亡。” - 从某种意义上说,这是两个独立的步骤。在这个例子中,函数调用是包含临时变量的完整表达式的最外层部分,但如果表达式类似于 `fn(42), fn(43), fn(44);` 那么名义上三个直到所有三个函数调用都完成后,临时对象才会被销毁。 (2认同)