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

kur*_*uro 4 c++ lifetime const-reference temporary-objects

考虑以下代码 -

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出是 -

Value: 6
Address: 0x7ffd45bf544c
Value: 32692
Run Code Online (Sandbox Code Playgroud)

为什么在打印变量的地址后值发生了变化k?如果我更换线const int& k = retRef()const int& k = 6;的输出为预期.

为什么这种行为不同?提前致谢

son*_*yao 6

您的代码具有未定义的行为; 你试图将一个临时 int(由文字构造6)绑定为引用作为返回值,但临时将被立即销毁然后retRef()总是返回一个悬挂引用,并且k也是悬空的.任何解除引用都会导致UB.

每当引用绑定到临时或子对象时,临时的生命周期将延长以匹配引用的生命周期,但以下情况除外:

  • return不会扩展对return语句中函数值的临时绑定:它会在返回表达式的末尾立即销毁.这样的函数总是返回一个悬空引用.

另一方面,const int& k = 6;工作正常,因为临时的寿命延长到k如上所述的寿命.