- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经使用 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 打印“My name is softwarelover”。如果我允许该语句运行,结果就会不同。它不是打印 5, 0,而是打印 0, 0。似乎是因为 "cout << "My name is softwarelover."引入的时间延迟,5 变成了 0。
上面的右值引用在引用一个原始整数时应该如何表现,该整数是一个函数通过引用返回而不是按值返回?对了,为什么是0,为什么不是垃圾?
另请注意,无论我用 cout 打印多少次,variable2 似乎永远不会消失! variable2 指的是一个原始整数,它是一个按值返回的函数,而不是按引用返回。
谢谢。
最佳答案
右值引用仍然只是引用。函数返回后,对函数局部变量的引用无效。幸运的是,在函数调用之后,您的右值引用在任何时候都是 5,因为它在函数返回后在技术上是无效的。
编辑:我正在扩展我的答案,希望有些人会发现一些有用的额外细节。
函数内部定义的变量是函数局部变量。该变量的生命周期仅限于声明它的函数内部。您可以认为它在函数返回时被“销毁”,但它并没有真正被销毁。如果它是一个对象,那么它的析构函数将被调用,但保存变量的内存仍然存在。您对该变量的任何引用或指针仍然指向内存中的同一位置,但该内存已被重新利用(或者可能在未来某个不确定的时间被重新利用)。
旧值(在您的情况下为“5”)将保留一段时间,直到出现某些内容并覆盖它。没有办法知道这些值还会存在多长时间,而且在函数返回后,任何人都不应该依赖它们仍然存在任何时间。一旦函数返回,请考虑对函数局部变量的任何引用(或指针)无效。打个比方,如果您去敲门,您可能不会觉得新房客满意。
关于c++ - 什么时候对原始整数的右值引用是短期的还是长期的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12267860/
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 5年前关闭。 Improve this
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我试图弄清楚如何基于 JSESSIONID cookie 为具有长期交互式用户 session 的 web 应用程序提供零停机滚动更新,这些 session 应该是粘性的。 出于这个(和其他)原因,我
这更像是一个“你能给我指出正确的方向吗”类型的问题。 基本上,我想为客户提供一种“保存”购物车的方法,也许以后可以与亲戚一起查看(这是摄影师客户的“照片篮”)。 当使用我的“照片篮”时,它会创建一个篮
我正在编写一个使用商店的网络应用程序。如果客户端在30秒内没有收到响应,则认为该请求已失效,并给出超时错误。 我正在尝试让 MongoDB 做同样的事情。例如,如果连接断开 1 分钟,驱动程序将尝试重
我多年来一直在开发和管理 Oracle 数据库应用程序,并且想学习 SQL Server。有没有人有任何书籍推荐(最好是电子版)。当然,我已经对 SQL 了如指掌,所以我想避免任何介绍性的内容,直接进
我是一名优秀的程序员,十分优秀!