通常认为静态对象的析构函数是按照构造函数相反的顺序调用的。根据我的理解,constinit 对象在编译时初始化,因此它们的析构函数应该在“普通”静态对象的析构函数之后调用。
程序:
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)
即constinit对象在“普通”静态对象之前被销毁(尽管它的构造早于后者)。对于constinit对象,这个“倒序规则”不再适用吗?