コンパイル時に文字列リテラルの長さを計算しようとしています。これを行うには、次のコードを使用しています。
#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関数がコンパイル時に評価されることは規格によって保証されていますか? 
これが当てはまる場合、コンパイル時の文字列リテラル計算のドアが開かれました...たとえば、コンパイル時にハッシュを計算できます...