Spec-Zone.ru › C

Спецификатор constexpr (с C23)

Скалярный объект, объявленный со спецификатором constexpr класса хранения, является константой. Он должен быть полностью и явно инициализирован в соответствии с правилами статической инициализации. У него всё ещё есть внешняя ссылка, соответствующая его объявлению, и он существует во время выполнения, чтобы можно было взять его адрес; его просто нельзя изменить во время выполнения, т.е. компилятор может использовать свои знания о фиксированном значении объекта в любом другом выражении константы.

Кроме того, выражение константы, используемое для инициализатора такой константы, проверяется во время компиляции.

Инициализатор с плавающей точкой должен быть вычислен с помощью среды плавающей точки времени трансляции.

Существуют некоторые ограничения на тип объекта, который может быть объявлен с constexpr. А именно, следующие конструкции не допускаются constexpr:

  • Указатели (за исключением того, что нулевые указатели могут быть constexpr),
  • Типы с переменной модификацией,
  • Атомные типы,
  • volatile типы,
  • restrict указатели.

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

constexpr

Примечания

Пример

#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

Spec-Zone.ru

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