Estoy tratando de calcular la longitud de una cadena literal en tiempo de compilación. Para hacerlo, estoy usando el siguiente código:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Todo funciona como se esperaba, el programa imprime 4 y 8. El código ensamblador generado por clang muestra que los resultados se calculan en tiempo de compilación:
0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d"
0x100000f65: movl $0x4, %esi
0x100000f6a: movl $0x8, %edx
0x100000f6f: xorl %eax, %eax
0x100000f71: callq 0x100000f7a ; symbol stub for: printf
Mi pregunta: ¿está garantizado por el estándar que la length
función se evaluará en tiempo de compilación?
Si esto es cierto, la puerta para los cálculos de literales de cadena en tiempo de compilación se me acaba de abrir ... por ejemplo, puedo calcular hashes en tiempo de compilación y muchos más ...