Если мы примем во внимание ограничения реального компьютера - такие как ограниченная память и конечное значение MAX_INT - тогда, конечно, constexpr (а также весь C ++) не полон по Тьюрингу.
Но еслимы удалим это ограничение - например, если мы будем думать о int как о совершенно произвольном натуральном числе - тогда да, часть constexpr в C ++ будет завершена по Тьюрингу.Любую частично рекурсивную функцию легко выразить.
0, S (n) = n + 1 и селекторы I_n ^ m (x_1, ..., x_n) = x_m, и суперпозиция, очевидно, может быть выражена с помощью constexpr.
Примитивную рекурсию можно сделать прямо:
constexpr int h(int x1, ..., int xn, int y) {
return (xn == 0) ? f(x1, ..., xn) : g(x1, ..., xn, y-1, h(x1, ..., xn, y-1));
}
А для частичной рекурсии нам нужен простой трюк:
constexpr int h(int x1, ... int xn, int y = 0) {
return (f(x1, ... xn, y) == 0) ? y : h(x1, ..., xn, y+1);
}
Итак, мы получаем любую частичную рекурсиюфункционировать как консистр.