当 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
的“幽灵”。这正是您在实验中看到的。当然,您不能在代码中有意义地依赖它。
关于c++ - 为什么没有悬挂引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16803540/