Лучшие вопросы
Таймлайн
Чат
Перспективы

Constexpr

Из Википедии, свободной энциклопедии

Remove ads

constexpr — спецификатор типа, введённый в стандарт программирования языка C++11 для обозначения константных выражений, которые могут быть вычислены во время компиляции кода[1]. Изначально стандартом языка C++11 на его применение был наложен ряд существенных условий и ограничений, однако большинство из них было снято после выхода стандарта C++14[2].

Описание

Суммиров вкратце
Перспектива

Спецификатор constexpr, аналогично унаследованному из C++98 спецификатору const, может быть использован по отношению к переменным, однако, помимо них, его можно также использовать в объявлениях функций и конструкторов классов. Объявление любых процедур со спецификатором constexpr означает, что их вычисление может быть проведено в упрощённом порядке на этапе компиляции кода. Это накладывает на них ряд существенных ограничений, например — недопустимость использования динамической памяти или генерирования исключений[3]. Кроме этого, вычисление возвращаемого значения constexpr-функции во время компиляции гарантируется, только если её аргументы являются константными выражениями, а контекст использования возвращаемого значения допускает присутствие константы периода компиляции. В противном случае функция будет производить вычисление своего возвращаемого значения на этапе выполнения кода[4].

Объявление constexpr-конструкторов должно быть тривиальным, а результатом их вызова будут объекты с полями только для чтения, создаваемые на этапе компиляции[5]. В отличие от constexpr-выражений, инициализацию констант, объявленных со спецификатором const, допускается выполнять во время выполнения кода[4].

Начиная со стандарта C++14 constexpr-функции получили возможность использовать внутри себя большинство управляющих структур обычного кода C++[6].

В стандартах C++11 и C++14 при использовании статических constexpr-членов классов их объявление в теле класса полагалось дополнять определением constexpr-переменных вне его. Однако, начиная со стандарта C++17 объявление constexpr-переменных внутри класса стало рассматриваться и как их определение, а любое дополнительное определение снаружи стало трактоваться как избыточное[7].

В редакции стандарта C++17 все лямбда-функции, которые удовлетворяют условиям для constexpr-функций, неявным образом заносятся в класс constexpr-выражений[5].

Remove ads

Примечания

Источники

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads