从函数返回临时对象的引用

时间:2018-12-03 06:50:48

标签: c++ lifetime temporary-objects const-reference

考虑以下代码-

#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;,则输出是预期的。

为什么会有这种不同的行为?预先感谢

3 个答案:

答案 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