为什么没有悬挂参考?

时间:2013-05-29 00:17:18

标签: c++ reference

bar超出范围时,我希望var会丢失参考值,但是当我将其打印出来时,它会正确地分配给它的初始值。这是为什么?

#include <iostream>

struct S
{
    int const& var;
    S(int const& bar = 5) : var(bar)
    {}
};

int main()
{
    S s;

    std::cout << s.var; // 5
}

1 个答案:

答案 0 :(得分:7)

是什么让你觉得这里没有悬空参考?有。程序的行为是未定义的,因为它会产生悬空引用。其余的只是未定义行为的具体表现。仅仅因为你的引用是悬空并不意味着它会以某种明显“破碎”的方式表现出来。

在您的情况下,引用可能会作为指针在引擎盖下实现。该指针最初是指向某个临时内存位置,该位置最初包含值5。后来记忆被“正式”发布,参考文献“正式”悬空。但指针仍保留其旧值,它指向的内存仍保留5的值。因此,在某人覆盖该临时内存或者有人重新初始化指针之前,您应该能够通过该悬挂引用看到5的“幽灵”。这正是您在实验中看到的内容。当然,你无法在代码中有意义地依赖它。