Ключевое слово constinit в C++20 предназначено для обеспечения гарантированного порядка инициализации глобальных переменных в разных единицах трансляции.
В стандарте C++ до версии C++20 порядок инициализации глобальных переменных в разных единицах трансляции был неопределенным. Это означает, что порядок загрузки этих единиц трансляции мог быть произвольным, что могло приводить к проблемам, если одна переменная зависит от другой.
С помощью ключевого слова constinit можно обеспечить строгий порядок инициализации глобальных переменных. Когда переменная объявлена с модификатором constinit, она гарантированно будет инициализироваться до момента, когда она будет использоваться в коде. Это означает, что все переменные, от которых зависит данная переменная, будут инициализированы ранее.
Например, если у нас есть две единицы трансляции, в одной из которых определена переменная A, а в другой - переменная B, и переменная B зависит от переменной A, мы можем объявить переменную B с модификатором constinit. В результате, при запуске программы переменная A будет инициализирована ранее, чем переменная B, что позволит избежать ошибок связанных с использованием незагруженных переменных.
Использование constinit может быть полезно в случаях, когда необходимо строго контролировать порядок инициализации глобальных переменных, особенно когда они зависят друг от друга. Это позволяет избежать проблемы фиаско инициализации статического порядка, которая могла возникать в предыдущих версиях стандарта C++.