通常说静态对象的析构函数的调用顺序与构造函数的调用顺序相反。据我所知,constnit对象是在编译时初始化的,所以它们的析构函数应该在";正常的";静态对象。
程序
struct A
{
constexpr A(const char* t): t_(t) {}
~A() {std::cout << "~A(" << t_ << ")n";}
const char* t_;
};
static A a1("static");
int main () {
static constinit A a2("constinit");
return 0;
}
(使用GCC 10(,但是,给出输出
~A(constinit)
~A(static)
即组成单元对象在";正常的";静态对象(尽管它是早期构建的(。是";"反向顺序";规则对组成单元对象不再有效?
a1
和a2
都是初始化的常量。constinit
说明符仅断言所定义的变量是初始化的常量。所以这里a1
在a2
之前被初始化,所以a2
在a1
之前被破坏。
是";"反向顺序";规则对constinit
对象不再有效逆序规则不在常量初始化的对象和动态初始化的对象之间:即使常量初始化对象的构建发生在动态初始化对象的构造之前,常量初始化对象被破坏的顺序也会像它们已经动态初始化一样:〔basic.start.term〕/3
如果对象被静态初始化,则该对象将按照与对象被动态初始化相同的顺序销毁。