当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
}
Run Code Online (Sandbox Code Playgroud)
是什么让你觉得这里没有悬空参考?有.程序的行为是未定义的,因为它会产生悬空引用.其余的只是未定义行为的具体表现.仅仅因为你的引用是悬空并不意味着它会以某种明显"破碎"的方式表现出来.
在您的情况下,引用可能会作为指针在引擎盖下实现.该指针最初是指向一些临时内存位置,该位置最初包含值5.后来记忆被"正式"发布,参考文献"正式"悬空.但指针仍然保留其旧值,它指向的内存仍保留值5.因此,在某人覆盖该临时内存或者某人重新初始化指针之前,您应该能够5通过该悬挂引用看到"幽灵" .这正是您在实验中看到的内容.当然,你无法在代码中有意义地依赖它.