考虑以下代码-
#include <iostream>
#include <stdio.h>
const int & retRef() {
return 6;
}
int main()
{
const int& k = retRef();
printf("Value: %d\n", k);
printf("Address: %p\n", &k);
printf("Value: %d\n", k);
return 0;
}
输出为-
Value: 6
Address: 0x7ffd45bf544c
Value: 32692
为什么在打印变量k
的地址后值发生了变化?如果我将行const int& k = retRef()
替换为const int& k = 6;
,则输出是预期的。
为什么会有这种不同的行为?预先感谢
答案 0 :(得分:5)
您的代码具有未定义的行为;您正在尝试将temporary v1
(由文字int
构造)绑定为引用作为返回值,但是临时变量将立即销毁,然后6
总是返回悬挂的参考,retRef()
也悬挂。任何对其的取消引用都将导致UB。
无论何时将引用绑定到临时对象或其子对象,临时对象的生存期都会延长以匹配引用的生存期,但以下情况除外:
- 与return语句中的函数的
k
值绑定的临时绑定不会扩展:它在return表达式的结尾立即被销毁。这样的函数总是返回一个悬空的引用。
另一方面,return
可以正常工作,因为如上所述,临时的生存期已延长到const int& k = 6;
的生存期。
答案 1 :(得分:3)
您正在返回对临时对象的引用,这将导致未定义的行为。函数返回后,该对象将不可用。
n4659-§15.2:
(6.2)—在函数
return
语句(9.6.3)中,临时绑定到返回值的生存期没有延长;临时文件会在return
语句的完整表达式结尾处销毁。
答案 2 :(得分:0)
在函数 retRef 中,您将返回对局部变量的引用。 退出函数时,函数内部的对象将被破坏,并且对该函数的所有引用都将变为无效。使用该链接将进一步带来不确定的行为...
trans_df
code price date time product flag actual_price
12023 71.23 01-01-2018 06:23:00 MS match 71.23
12023 61 01-01-2018 07:56:00 HS match 61
12023 71.23 01-01-2018 08:34:00 MS match 71.23
12023 71.30 01-01-2018 06:03:00 MS mismatch 71.23
12023 61 01-01-2018 11:43:00 HS match 61
12023 71.23 01-01-2018 10:11:00 MS match 71.23
12023 71.23 01-01-2018 04:23:00 MS nan nan
12023 72.23 02-01-2018 10:11:00 MS match 72.23
12023 72.23 02-01-2018 04:23:00 MS match 72.23