Спецификатор constexpr (с 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; // is not affected by fesetround() above
printf("%f\n", h);
}Вывод:
0.696969
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- TBD TBD (стр.: TBD)
См. также
Документация C++ для constexpr спецификатор типа |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/constexpr