Обычно говорят, что деструкторы статических объектов вызываются в обратном порядке по отношению к конструкторам. Насколько я понимаю, объекты 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?