コンパイル時に文字列リテラルの長さを計算しようとしています。これを行うには、次のコードを使用しています。
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
すべてが期待どおりに機能し、プログラムは4と8を出力します。clangによって生成されたアセンブリコードは、結果がコンパイル時に計算されることを示しています。
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
私の質問:length
関数がコンパイル時に評価されることは規格によって保証されていますか?
これが当てはまる場合、コンパイル時の文字列リテラル計算のドアが開かれました...たとえば、コンパイル時にハッシュを計算できます...