【发布时间】:2019-05-16 01:59:02
【问题描述】:
https://en.cppreference.com/w/cpp/language/lifetime 在 Notes 部分有这段代码,在此转载:
struct A {
int* p;
~A() { std::cout << *p; } // if n outlives a, prints 123
};
void f() {
A a;
int n = 123; // if n does not outlive a, this is optimized out (dead store)
a.p = &n;
}
Notes 部分想要表达什么?
据我了解,代码是 UB(或者是),因为很明显 n 不会比 a 寿命长。
这是什么意思:
非类对象之间的生命周期结束规则的差异(结束 存储期限)和类对象(构造的相反顺序) 很重要
但它并没有说重要如何。
我对这整个部分感到非常困惑。
【问题讨论】:
-
我不确定他们在注释部分想说什么。 AFAIK 这是符合标准的 UB。
-
@NathanOliver 我认为这可能暗示
n确实比a活得更久,因为a在右大括号之前被破坏,而n在右大括号处被破坏。不过,我不相信这是真的。 -
我认为逆序销毁意味着
n在a之前被销毁,导致UB。 -
这是core issue 2256。我们从有关该主题的核心反射器帖子之一中获取了这个示例(Clang 根据当前规则“错误编译”)。
标签: c++ language-lawyer undefined-behavior