Ключевое слово constinit
Ключевое слово constinit применяется к переменным
со статическим или потоковым временем жизни и требует,
чтобы их инициализация происходила на этапе компиляции.
В отличие от constexpr, оно не делает переменную
константной - её значение можно изменять во время
выполнения программы. Если инициализатор не может быть
вычислен компилятором, программа не соберётся.
Ключевое слово помогает избежать проблемы порядка
инициализации статических объектов.
Синтаксис
constinit тип имя = инициализатор;
constinit тип имя;
Ключевое слово указывается перед типом переменной.
Его можно комбинировать с const и constexpr.
Пример
Объявим глобальную переменную с constinit
и выведем её значение:
#include <iostream>
using namespace std;
constinit int num = 12345;
int main()
{
cout << num << endl;
return 0;
}
Результат выполнения кода:
12345
Пример
Переменная с constinit может изменяться
во время выполнения программы:
#include <iostream>
using namespace std;
constinit int num = 12345;
int main()
{
num = 111;
cout << num << endl;
return 0;
}
Результат выполнения кода:
111
Пример
Комбинация constinit и constexpr
делает переменную одновременно константной и
гарантированно инициализированной на этапе компиляции:
#include <iostream>
using namespace std;
constexpr constinit int num = 12345;
int main()
{
cout << num << endl;
return 0;
}
Результат выполнения кода:
12345
Пример
Если инициализатор не является константным выражением, компилятор выдаст ошибку:
#include <iostream>
using namespace std;
int getValue()
{
return 12345;
}
constinit int num = getValue();
int main()
{
cout << num << endl;
return 0;
}
Результат выполнения кода:
error: 'constinit' variable 'num' does not have a constant initializer