Меню
Главная
Случайная статья
Настройки
|
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].
Примечания
- constexpr specifier (since C++11) Архивная копия от 25 марта 2019 на Wayback Machine cppreference.com
- Вандевурд, Джосаттис, Грегор, 2018, Вычисления с использованием constexpr, с. 161.
- Вандевурд, Джосаттис, Грегор, 2018, Вычисления с использованием constexpr, с. 161—162.
- 1 2 Olsson, 2018, Constant Expressions, p. 129.
- 1 2 Olsson, 2018, Constant Expressions, p. 130.
- Вандевурд, Джосаттис, Грегор, 2018, Вычисления с использованием constexpr, с. 162.
- Вандевурд, Джосаттис, Грегор, 2018, Стандарты C++11, C++14 и C++17, с. 33.
Источники- Д. Вандевурд, Н. Джосаттис, Д. Грегор. Шаблоны C++. Справочник разработчика = C++ Templates. The Complete Guide. — 2-е. — СПб. : «Альфа-книга», 2018. — 848 с. — ISBN 978-5-9500296-8-4.
- M. Olsson. C++17 Quick Syntax Reference: A Pocket Guide to the Language, APIs and Library. — Third Edition. — Apress, 2018. — ISBN 978-1-4842-3599-7. — doi:10.1007/978-1-4842-3600-0.
|
|