对基元整数的右值引用是短命的还是长寿命的
When are rvalue references to primitive integers short-lived or long-lived?
我用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返回并由variable1接收的值似乎在一段时间后消失了——也许是几毫秒的短暂时间。请注意,我已经通过注释阻止了cout打印"我的名字是软件"。如果我允许运行该语句,结果会有所不同。它不打印5,0,而是打印0,0。这似乎是因为"cout<<"引入的延迟。我的名字叫softwareover。"5变成0。
当引用一个基元整数时,函数通过引用返回,而不是通过值返回,右值引用的行为应该是这样的吗?顺便问一下,为什么它是0,为什么不是垃圾?
还要注意,variable2似乎永远不会消失,无论我用cout打印了多少次!variable2指的是一个基元整数,函数通过值返回,而不是通过引用返回。
谢谢。
编辑:我正在扩展我的答案,希望有些人会发现一些额外的细节有用。
函数内部定义的变量是函数的局部变量。该变量的生存期限制在声明它的函数内部。当函数返回时,你可以认为它被"销毁"了,但它并没有真正被销毁。如果它是一个对象,那么它的析构函数将被调用,但保存变量的内存仍然存在。您对该变量的任何引用或指针仍然指向内存中的同一位置,但该内存已被重新使用(或可能在未来某个不确定的时间被重新使用)。
旧值(在您的情况下为"5")将在那里保留一段时间,直到出现并覆盖它。无法知道这些值将在那里停留多久,并且在函数返回后,任何人都不应该依赖它们在那里停留任何时间。一旦函数返回,就认为对函数局部变量的任何引用(或指针)都是无效的。打个比方说,如果你去敲门,你可能会觉得新房客不讨人喜欢。
- 取消引用指向整数的指针时获得不同的结果
- 创建<int>对整数数组指针的矢量引用 (C++)
- 此代码如何使用整数为您提供引用?
- 取消引用指向整数的指针会导致分段错误
- 通过使用CTYPES通过引用传递整数数组
- 对随机整数的未定义引用
- 对基元整数的右值引用是短命的还是长寿命的
- 为什么数字10用于引用整数类型0
- 当我们在 c++ 中将常量整数引用分配给整数指针时,行为是什么
- 你能取消引用一个整数文本吗
- Rcpp,C++:对于大小变化的整数向量,通过引用传递
- 将短*/双*转换为整数*,然后返回并取消引用
- 返回对整数的引用时使用C++代码
- 整数变量如何存储对整数的引用
- 将整数传递给请求引用的函数
- 对静态整数数组的未定义引用
- 如何在C++中通过引用传递"literal"整数
- 用整数引用c#的封送结构
- 你能通过对指针解引用返回一个整数吗?
- 为什么我不能使用 static_cast<int&> 将整数引用参数传递给 C++ 中的函数?