当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
}
是什么让你觉得这里没有悬而未决的参考?有。您的程序的行为是未明确定义的,因为它会产生一个悬空引用。其余的只是未定义行为的具体表现。仅仅因为您的引用悬空并不意味着它将以某种明确的“破坏”方式表现。
在您的情况下,引用可能会在引擎盖下作为指针实现。该指针最初是指向某个临时内存位置的,该位置最初包含 value 5
。后来内存被“正式”释放,引用变得“正式”悬空。但是指针仍然保留了它的旧值,并且它指向的内存仍然保留了5
. 因此,在有人覆盖该临时内存或直到有人重新初始化指针之前,您应该能够5
通过该悬空引用看到它的“幽灵”。这正是您在实验中看到的。当然,您不能在代码中有意义地依赖它。