Saya mencoba menghitung panjang string literal pada waktu kompilasi. Untuk melakukannya, saya menggunakan kode berikut:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Semuanya bekerja seperti yang diharapkan, program mencetak 4 dan 8. Kode assembly yang dihasilkan oleh clang menunjukkan bahwa hasil dihitung pada waktu kompilasi:
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
Pertanyaan saya: apakah dijamin oleh standar bahwa length
fungsi akan dievaluasi waktu kompilasi?
Jika ini benar, pintu untuk komputasi literal string waktu kompilasi baru saja dibuka untuk saya ... misalnya saya dapat menghitung hash pada waktu kompilasi dan banyak lagi ...