Когда вызывается деструктор объекта constinit?
Обычно говорят, что деструкторы статических объектов вызываются в порядке, обратном конструкторам. Насколько я понимаю, объекты 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 уничтожается раньше "нормального" статического объекта (хотя он был построен ранее). Правило "обратного порядка" больше не действует для постоянных объектов?
1 ответ
И то и другое a1
а также a2
являются постоянными инициализирован. Вconstinit
спецификатор только утверждает, что определяемая переменная инициализирована константой. Так вотa1
инициализируется до a2
так a2
уничтожен до a1
как и ожидалось.
Правило "обратного порядка" больше не действует для constinit
объекты? Правило обратного порядка не применяется между постоянным инициализированным объектом и динамически инициализированным объектом: даже если создание постоянного инициализированного объекта происходит до создания динамически инициализированного объекта, уничтожение постоянного инициализированного объекта происходит так, как если бы они были инициализированы динамически: [basic.start. срок]/3
Если объект инициализируется статически, он уничтожается в том же порядке, как если бы объект был инициализирован динамически.