取消引用悬空指针是不确定的行为?

use*_*239 9 c++ undefined-behavior language-lawyer

我无法在标准中找到该程序未定义的位置:

#include <iostream>

int main() 
{
    int *p;
    {
        int n = 45;
        p = &n;
    }
    std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)

§3.8对象生命周期中的所有情况似乎都不适用于此处.

Mar*_*k B 6

我不是100%肯定因为措辞,但看起来这是由3.8/6覆盖(我认为这种解释是正确的原因是因为3.8/5中的非规范性示例,// undefined behavior, lifetime of *pb has ended):

...在对象的生命周期结束之后,在重用或释放对象占用的存储之前,可以使用引用原始对象的任何glvalue,但只能以有限的方式使用....如果程序具有未定义的行为,则:

然后第一个子弹是罪魁祸首:: an lvalue-to-rvalue conversion (4.1) is applied to such a glvalue,这种转换必须在调用点operator<<或最终在读取整数值的位置进行,以便在ostream代码中进行格式化.