А.4.4. constexpr и шаблоны
Спецификатор constexpr в объявлении шаблона функции или функции-члене шаблонного класса игнорируется, если типы параметров и возвращаемого значения для данной конкретизации шаблона не являются литеральными. Это позволяет писать шаблоны функций, которые становятся constexpr-функциями, если параметры шаблона имеют подходящие типы, и обычными встраиваемыми функциями в противном случае. Например:
template<typename T>
constexpr T sum(T a, T b) {
return a + b;
} │ Правильно, sum<int>
constexpr int i = sum(3, 42);←┘ constexpr
std::string s =
sum(std::string("hello"), │ Правильно, но sum<std::string>
std::string(" world"));←┘ He constexpr
Функция должна удовлетворять также всем остальным требованиям, предъявляемым к constexpr-функциям. Нельзя включить в тело шаблона функции, объявленного как constexpr, несколько предложений только потому, что это шаблон; компилятор сочтет это ошибкой.