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

Returning reference of a temporary object from a function

考虑以下代码 -

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

为什么会出现这种不同的行为?提前致谢

您正在返回对临时对象的引用,这将导致未定义的行为。一旦函数 returns,该对象将不可用。

n4659 - § 15.2:

(6.2) — The lifetime of a temporary bound to the returned value in a function return statement (9.6.3) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.

您的代码有未定义的行为;您正在尝试绑定 temporary int(由文字 6 构造)以引用为 return 值,但临时文件将立即被销毁 retRef() 总是 return 是悬空引用,并且 k 也是悬空引用。对它的任何取消引用都会导致 UB。

Whenever a reference is bound to a temporary or to a subobject thereof, the lifetime of the temporary is extended to match the lifetime of the reference, with the following exceptions:

  • a temporary bound to a return value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such function always returns a dangling reference.

另一方面,const int& k = 6; 工作正常,因为如上所述,临时文件的生命周期延长到 k 的生命周期。

在函数 retRef 中,您将返回对局部变量的引用。 退出函数时,函数内部的对象将被销毁,所有对它的引用都将失效。使用 link 将进一步导致未定义的行为...

const int & retRef()
{
    return 6;
}