Ваш текущий код обычно записывается следующим образом:
constexpr factorial (int n)
{
return n > 0 ? n * factorial( n - 1 ) : 1;
}
Если вы вызываете его с помощью константного выражения, такого как factorial(5)
, тогда вся магия компилятора вступит в игру. Но если вы сделаете int a = 3; factorial(a)
, то я думаю, что он прибегнет к обычной функции - то есть не будет построена таблица поиска предварительно вычисленных ответов.
В общем, вы должны пометить каждую функцию и конструктор как constexpr
, если можете. Вы ничего не потеряете, компилятор при необходимости сочтет это нормальной функцией.