什么时候调用 constinit 对象的析构函数?
When is the destructor of a constinit object called?
一般说静态对象的析构函数是按照与构造函数相反的顺序调用的。据我了解,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 对象不再有效吗?
a1
和 a2
都是常量初始化的。 constinit
说明符仅断言正在定义的变量是 constant-initialized。所以这里 a1
在 a2
之前初始化,所以 a2
按预期在 a1
之前销毁。
“倒序”规则对constinit
对象不再有效吗?倒序规则在constant initialized[=29]之间不生效=] 对象和 动态初始化的 对象:即使常量初始化对象的构造发生在动态初始化对象的构造之前,常量初始化对象的销毁也会按照动态初始化的顺序进行:[basic.start.term]/3
If an object is initialized statically, the object is destroyed in the same order as if the object was dynamically initialized.
一般说静态对象的析构函数是按照与构造函数相反的顺序调用的。据我了解,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 对象不再有效吗?
a1
和 a2
都是常量初始化的。 constinit
说明符仅断言正在定义的变量是 constant-initialized。所以这里 a1
在 a2
之前初始化,所以 a2
按预期在 a1
之前销毁。
“倒序”规则对constinit
对象不再有效吗?倒序规则在constant initialized[=29]之间不生效=] 对象和 动态初始化的 对象:即使常量初始化对象的构造发生在动态初始化对象的构造之前,常量初始化对象的销毁也会按照动态初始化的顺序进行:[basic.start.term]/3
If an object is initialized statically, the object is destroyed in the same order as if the object was dynamically initialized.