Si tomamos en cuenta las restricciones de ordenador real - como la memoria finita y un valor finito de MAX_INT - entonces, por supuesto, constexpr (y también todo el C++) no es Turing-completo.
Pero si eliminamos esta restricción, por ejemplo, si pensamos en int como un entero positivo completamente arbitario, entonces sí, una parte constestable de C++ será completa. Es fácil expresar cualquier función recursiva parcial.
0, S (n) = n + 1 y los selectores I_n^m (x_1, ..., x_n) = x_m y la superposición obviamente se puede expresar usando constexpr.
recursividad primitiva se puede hacer que camino recto:
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));
}
Y para recursividad parcial necesitamos un truco sencillo:
constexpr int h(int x1, ... int xn, int y = 0) {
return (f(x1, ... xn, y) == 0) ? y : h(x1, ..., xn, y+1);
}
por lo que tenemos una función parcial recursividad como constexpr.
¡Interesante! Si entendí correctamente, la distinción depende del hecho de que un programa solo puede tener un número finito de objetos de duración de almacenamiento estático, pero puede tener un número potencialmente infinito de temporales. ¿Podrías explicar por qué es eso? – HighCommander4
@ HighCommander4 Cada objeto de duración de almacenamiento estático se introduce mediante una declaración en el código fuente (del cual solo hay un número finito, y cada uno presenta solo un número finito de objetos direccionables por separado), mientras que la recursión ilimitada puede introducir un número ilimitado de los temporales. Este punto de vista se aplica solo a la máquina abstracta de C++: toda implementación real finalmente alcanzará algún tipo de límite de recursos, por lo que todavía tiene un límite finito (aunque normalmente desconocido). –
Cómo muy abstracto :-) –