我已经使用TDM-GCC 4.6.1编译器对右值引用进行了一些实验,并做了一些有趣的观察,这些我无法用理论来解释。我希望那里的专家可以帮助我解释一下。
我有一个非常简单的程序,它不处理对象,但处理int原语,并定义了2个函数:
foo1(通过右值引用返回局部变量)和
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返回的值和变量1接收的值在一段时间后消失了-可能是短暂的几毫秒。请注意,我已通过注释将cout禁止打印“ My name is softwarelover”。如果我允许该语句运行,结果将有所不同。而不是打印5、0,而是打印0、0。这似乎是由于“ cout <
上面提到的是右值引用在引用函数返回的原始整数时所应具有的行为吗?顺便说一句,为什么它为0,为什么不垃圾呢?
还请注意,无论我使用cout打印多少次,variable2似乎都不会消失! variable2指的是一个原始整数,该函数按值而不是按引用返回。
谢谢。
最佳答案
右值引用仍然只是引用。函数返回后,对函数局部变量的引用无效。您很幸运,在函数调用之后,您的右值引用始终为5,因为从技术上讲,该值在函数返回后是无效的。
编辑:我正在扩展我的答案,希望有人会发现一些有用的额外细节。
在函数内部定义的变量是函数局部变量。该变量的生命周期仅限于在其内声明的函数内部。您可以将其视为在函数返回时被“破坏”,但并未真正销毁。如果它是一个对象,则将调用其析构函数,但是保存该变量的内存仍然存在。您必须对该变量进行的任何引用或指针仍指向内存中的同一位置,但是该内存已被重新利用(或者将来可能会在不确定的时间内被重新利用)。
旧值(在您的情况下为“ 5”)仍会存在一段时间,直到出现某些情况并覆盖它。没有办法知道这些值将仍然存在多长时间,并且在函数返回后的任何时间内都不会有人依赖它们仍然存在。一旦函数返回,请考虑对函数局部变量的任何引用(或指针)均无效。隐喻地,如果您敲门,您可能会发现新租户不太满意。
关于c++ - 右值引用原始整数是短命的还是长命的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12267860/