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