下面的代码编译并运行得很好。正当我以为我开始对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'的位置答案 0 :(得分:4)
我可以在低层告诉我们这里发生了什么的一些细节。
在堆栈上创建类型为int
的临时变量
main
。它的值为42。
临时地址传递给fn
。
fn
按地址写入43,更改临时值。
函数退出,临时在涉及调用的完整表达式结束时死亡。
答案 1 :(得分:1)
取其地址,即&amp; n,您将看到其指针值。
你可以将一个局部变量粘贴到你的函数中,也可以放在main中并获取它们的地址,看看它们在哪里,但依赖于它们之间的任何比较都是未定义的行为。
int不是const是正确的,你的函数获取它。以同样的方式,您可以使用r值引用初始化具有集合的类,然后类可以稍后修改它,即它不必是const成员。但是没有副本。
按照标准,“移动”的对象将处于稳定,可用的状态,但它所保持的实际值是未定义的。