rvalue引用原始整数的时间是短暂的还是长寿的?

时间:2012-09-04 16:39:37

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

我已经使用TDM-GCC 4.6.1编译器对rvalue引用进行了一些实验,并做了一些有趣的观察,我无法用理论解释。我希望那里的专家帮我解释一下。

我有一个非常简单的程序,它不处理对象而是int原语并定义了2个函数: foo1(通过rvalue引用返回局部变量)和 foo2(按值返回局部变量)

#include <iostream>

using namespace std;

int &&foo1();
int foo2();

int main()
{

int&& variable1 = foo1();
//cout << "My name is softwarelover." << endl;
cout << "variable1 is: " << variable1 << endl; // Prints 5.
cout << "variable1 is: " << variable1 << endl; // Prints 0.

int&& variable2 = foo2();
cout << "variable2 is: " << variable2 << endl; // Prints 5.
cout << "variable2 is still: " << variable2 << endl; // Still prints 5!

return 0;
}

int &&foo1() {

int a = 5;
return static_cast<int&&>(a);
}

int foo2() {

int a = 5;
return a;
}

似乎foo1返回并由variable1接收的值在一段时间后消失 - 也许是一段几毫秒的短暂时间。请注意,我通过评论来阻止cout打印“我的名字是softwarelover”。如果我允许该语句运行,结果会有所不同。它不打印5,0而是打印0,0。看起来好像是因为“cout&lt;&lt;”所引入的时间延迟,我的名字是“软件中心”。“5变为0。

上面提到的rvalue引用在引用由引用返回的函数而不是按值返回的原始整数时应该如何表现?那么,为什么不是0,为什么不垃圾?

另请注意,无论我用cout打印多少次,变量2似乎都不会消失! variable2是指一个原始整数,它是一个由值返回的函数,而不是按引用返回。

感谢。

1 个答案:

答案 0 :(得分:5)

Rvalue引用仍然只是引用。函数返回后对函数局部变量的引用无效。你很幸运,在函数调用之后你的rvalue引用在任何时候都是5,因为在函数返回后它在技术上是无效的。

编辑:我正在扩展我的答案,希望有些人会发现一些有用的额外细节。

函数内定义的变量是函数局部变量。该变量的生命周期仅限于声明它的函数内部。当函数返回时,您可以将其视为“已销毁”,但它并未真正被破坏。如果它是一个对象,那么它的析构函数将被调用,但是保存该变量的内存仍然存在。您对该变量的任何引用或指针仍然指向内存中的相同位置,但该内存已被重新定位(或者可能在将来某个不确定的时间重新使用)。

旧的值(在你的情况下为'5')仍然存在一段时间,直到出现并覆盖它。没有办法知道值仍然存在多长时间,并且任何人都不应该依赖它们在函数返回后仍然存在任何时间。一旦函数返回,请考虑使局部变量无效的任何引用(或指针)。比喻说,如果你去敲门,你可能不会觉得新租客同意。