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