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
}
4

1 回答 1

8

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

在您的情况下,引用可能会在引擎盖下作为指针实现。该指针最初是指向某个临时内存位置的,该位置最初包含 value 5。后来内存被“正式”释放,引用变得“正式”悬空。但是指针仍然保留了它的旧值,并且它指向的内存仍然保留了5. 因此,在有人覆盖该临时内存或直到有人重新初始化指针之前,您应该能够5通过该悬空引用看到它的“幽灵”。这正是您在实验中看到的。当然,您不能在代码中有意义地依赖它。

于 2013-05-29T00:23:17.947 回答