constexpr specifier (since C23)
Скалярный объект, объявленный с описателем класса хранения constexpr , является константой . Он должен быть полностью и явно инициализирован в соответствии с правилами статической инициализации. Он сохраняет связывание, соответствующее его объявлению, и существует во время выполнения для возможности взятия его адреса; однако он не может быть изменен во время выполнения любым способом, т.е. компилятор может использовать знание фиксированного значения объекта в любом другом константном выражении .
Кроме того, константное выражение, используемое для инициализатора такой константы, проверяется во время компиляции.
Инициализатор типа с плавающей запятой должен вычисляться в среде с плавающей запятой на этапе трансляции.
Существуют некоторые ограничения на тип объекта, который может быть объявлен с constexpr . А именно, следующие конструкции не могут быть constexpr :
- Указатели (за исключением того, что нулевые указатели могут быть constexpr ),
- Типы с переменной модификацией,
- Атомарные типы ,
-
volatileтипы, -
restrictуказатели.
Содержание |
Ключевые слова
Пример
#include <fenv.h> #include <stdio.h> int main(void) { constexpr float f = 23.0f; constexpr float g = 33.0f; fesetround(FE_TOWARDZERO); constexpr float h = f / g; // не затрагивается вызовом fesetround() выше printf("%f\n", h); }
Вывод:
0.696969
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 6.7.2 Спецификаторы класса хранения (стр: 98-103)
Смотрите также
|
Документация C++
для
constexpr
спецификатора типа
|