在这段关于程序退出cppreference.com
的文章中如果构造函数的完成或线程局部或静态对象A的动态初始化在线程局部或静态对象B之前被排序,则在破坏A开始之前对B的销毁完成进行排序。
“之前排序”的含义是什么?
特别是,对于这个程序
struct Object {
Object() {
}
~Object() {
}
};
Object a;
void f() {
static Object b;
}
int main() {
f();
}
可以安全地假设a.~Object()
在 b.~Object()
后被称为,因为a.Object()
在 b.Object()
之前被称为 ?
答案 0 :(得分:0)
“之前排序”是什么意思?
对象在运行时由序列中的运行时环境初始化。如果在初始化第二个对象之前初始化了一个对象,那么第一个对象的构造就是“在构造第二个对象之前进行排序”。
是否可以安全地假设在
a.~Object()
后调用b.~Object()
,因为在a.Object()
之前调用了b.Object()
?
如果您认为在a.Object()
之前调用了b.Object()
,那么您可以假设在a.~Object()
之后调用了b.~Object()
。然而,情况并非总是如此。在您发布的代码中是真的。但是,在更复杂的应用程序中,在f()
初始化之前调用a
是可能的。