16

下面的代码编译并运行得很好。就在我认为我开始对右值引用和 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 中的什么位置?

4

2 回答 2

6

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

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

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

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

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

于 2012-10-16T08:49:24.150 回答
2

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

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

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

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

于 2012-10-16T08:49:34.750 回答