А.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, несколько предложений только потому, что это шаблон; компилятор сочтет это ошибкой.