Namespaces
Variants

constexpr specifier (since C23)

From cppreference.net

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

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

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

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

Содержание

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

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; // не затрагивается вызовом fesetround() выше
    printf("%f\n", h);
}

Вывод:

0.696969

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 6.7.2 Спецификаторы класса хранения (стр: 98-103)

Смотрите также

Документация C++ для constexpr спецификатора типа