Каждая constexpr
функция является чистой, но не каждая чистая функция может или должна быть constexpr
.
[Примеры, включающие constexpr
шаблоны функций, вводят в заблуждение, поскольку шаблоны функций не являются функциями, это шаблоны, с помощью которых компилятор может генерировать функции. Результатом шаблонов функций, их специализаций, являются функции, и они будут будут constexpr
, если это возможно.]
Чистая функция - это функция, зависящая только от ее аргументов или другого постоянного состояния. Это почти то же самое, что и функция constexpr
. Кроме того, функции constexpr
должны быть определены (а не только объявлены) до их первого использования (хотя рекурсия представляется разрешенной) и должны состоять только из оператора return. Этого достаточно, чтобы сделать допустимое подмножество Тьюринга полным, но результат не обязательно является наиболее эффективной формой во время выполнения.
Что подводит нас к математическим функциям. Вероятно, вы можете реализовать constexpr
sqrt()
или sin()
, но им придется использовать рекурсивную реализацию, которую компилятор может оценивать во время компиляции, тогда как во время выполнения они будут лучше реализованы в одной операции ассемблера. Поскольку constexpr
использует sqrt()
и sin()
немного и далеко друг от друга, лучше вместо этого максимизировать производительность во время выполнения, для которой требуется форма, которая не constexpr
способна.
Вы можете задаться вопросом, почему вы не можете написать одну constexpr
версию функции и ту, которая используется во время выполнения, и я согласился бы, что было бы неплохо это иметь, но стандарт говорит, что вы не можете перегружать constexpr
Несс. Может быть, в C ++ 17 ...