Когда вызывается деструктор объекта 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

Если объект инициализируется статически, он уничтожается в том же порядке, как если бы объект был инициализирован динамически.

Другие вопросы по тегам