为什么没有悬空引用?

4

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个回答

8
你怎么认为这里没有悬空引用?实际上有。你的程序行为是未定义的,因为它产生了一个悬空引用。其余部分只是未定义行为的具体表现。仅仅因为你的引用是悬空的,并不意味着它会以某种明确的“损坏”方式行事。
在您的情况下,该引用可能会在底层作为指针实现。该指针最初指向某些临时内存位置,该位置最初包含值5。后来,内存被“正式”释放,引用变成了“正式”的悬空引用。但指针仍保留其旧值,它所指向的内存仍保留值5。因此,在有人覆盖临时内存或有人重新初始化指针之前,您应该能够通过那个悬空引用看到那个5的“幽灵”。这就是您在实验中看到的情况。当然,在您的代码中不能有意义地依赖它。

另外,请注意这与本地 const 引用不同,后者会延长绑定到它们的临时对象的生命周期。 - Matteo Italia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接