4

考虑以下代码 -

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

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

4

3 回答 3

6

您的代码具有未定义的行为;您正在尝试将临时 int(由 literal 构造6)绑定到作为返回值的引用,但临时将立即被销毁,然后retRef()总是返回一个悬空引用,并且k也是悬空的。对它的任何取消引用都会导致 UB。

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

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

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

于 2018-12-03T06:54:13.470 回答
3

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

n4659 - § 15.2:

return(6.2) — 在函数语句 (9.6.3) 中绑定到返回值的临时绑定的生命周期没有延长;return临时在语句中的完整表达式结束时被销毁。

于 2018-12-03T06:53:40.083 回答
0

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

const int & retRef()
{
    return 6;
}
于 2018-12-03T06:55:43.660 回答