Spec-Zone.ru › C++

Спецификатор 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); // error

constinit также может быть использован в неинициализирующем объявлении, чтобы указать компилятору, что переменная 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

Ключевые слова

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API