gpt4 book ai didi

c++ - 何时调用 constinit 对象的析构函数?

转载 作者:行者123 更新时间:2023-12-01 13:03:52 25 4
gpt4 key购买 nike

一般说静态对象的析构函数是以与构造函数相反的顺序调用的。据我了解,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 对象不再有效吗?

最佳答案

两者 a1a2是常量初始化的。 constinit说明符仅断言所定义的变量是常量初始化的。所以这里a1a2 之前初始化所以a2之前被破坏 a1正如预期的那样。
“逆序”规则对 constinit 不再有效吗?对象?常量初始化对象和动态初始化对象之间不存在倒序规则:即使常量初始化对象的构建发生在动态初始化对象的构建之前,常量初始化对象的销毁也按照它们已经动态初始化的顺序进行:[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.

关于c++ - 何时调用 constinit 对象的析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62928164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com