Спецификатор constinit (с C++20)
-
constinit- утверждает, что переменная имеет статическую инициализацию, т.е. нулевую инициализацию и постоянную инициализацию, в противном случае программа некорректна.
Объяснение
Спецификатор constinit объявляет переменную со статическим или потоковым временем жизни. Если переменная объявлена с constinit, её инициализирующее объявление должно быть применено с constinit. Если переменная, объявленная с constinit, имеет динамическую инициализацию (даже если она выполняется как статическая инициализация), программа некорректна. Если ни одно объявление constinit не достижимо в момент инициализирующего объявления, программа некорректна, диагностика не требуется.
constinit не может использоваться вместе с constexpr. Когда объявленная переменная является ссылкой, constinit эквивалентен constexpr. Когда объявленная переменная является объектом, constexpr предписывает, что объект должен иметь статическую инициализацию и постоянное уничтожение, и делает объект const-квалифицированным, однако constinit не предписывает постоянного уничтожения и const-квалификации. В результате объект типа, имеющего конструкторы constexpr и отсутствующий деструктор constexpr (например, std::shared_ptr<T>) может быть объявлен с constinit, но не с constexpr.
const char* g() { return "dynamic initialization"; }
constexpr const char* f(bool p) { return p ? "constant initializer" : g(); }
constinit const char* c = f(true); // OK
// constinit const char* d = f(false); // errorconstinit также может быть использован в неинициализирующем объявлении, чтобы указать компилятору, что переменная thread_local уже инициализирована, уменьшая накладные расходы, которые в противном случае были бы понесены скрытой переменной-защитой.
extern thread_local constinit int x;
int f() { return x; } // no check of a guard variable neededПримечания
| Макрос проверки функций | Значение | Std | Функция |
|---|---|---|---|
__cpp_constinit | 201907L | (C++20) | constinit |
Ключевые слова
Пример
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, опубликованное в оригинале | Правильное поведение |
|---|---|---|---|
| CWG 2543 | C++20 | поведение было неясно, если переменная, объявленная с constinit, инициализируется динамически в рамках статической инициализации | программа некорректна в этом случае |
См. также
consteval спецификатор(C++20) | указывает, что функция является немедленной функцией, то есть каждый вызов функции должен быть в вычислении константы |
constexpr спецификатор(C++11) | указывает, что значение переменной или функции может быть вычислено на этапе компиляции |
| константное выражение | определяет выражение, которое может быть вычислено на этапе компиляции |
| постоянная инициализация | устанавливает начальные значения статических переменных до константы времени компиляции |
| нулевая инициализация | устанавливает начальное значение объекта в ноль |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/constinit