コンパイル時に C++ コンパイラが定数文字列のハッシュ値を合成する派手なゲームをプレイしようとしています。これにより、文字列を単一の識別子に置き換えることができ、コードのサイズと複雑さを大幅に節約できます。
プログラミングをわかりやすく簡単にするために、コンパイル時定数文字へのコンパイル時定数ポインターである "Hello" のような単純なインライン文字列を使用して、コンパイル時に調べて計算できれば最高です。
コンパイル時にこれらにインデックスを付けることができれば、テンプレート メタプログラムを作成して、自分のやりたいことを実行できます。しかし、C++ 標準が ct-constant 配列の ct-constant インデックスをそれ自体で ct-constant として扱うかどうかは不明です。
別の言い方をすると、
const char v="Hello"[0];
非常に有効な C++ (および C) です。しかし、値 va はコンパイル時定数ですか?
私はすでに答えはノーだと信じていますが、実際には一部のコンパイラは警告さえもせずにそれを受け入れ、エラーははるかに少なくなります。たとえば、次のコードは、Intel の C++ コンパイラからの警告が 1 つも表示されずにコンパイルおよび実行されます。
#include <iostream>
const char value="Hello"[0];
template<char c> void printMe()
{
std::cout << "Template Val=" << c << std::endl;
}
int main()
{
const char v='H';
printMe<'H'>();
printMe<v>();
printMe<value>(); // The tricky and interesting case!
}
ただし、Microsoft のコンパイラはまったくコンパイルせず、内部リンケージを持つオブジェクトでテンプレートを使用することについて、合理的に一貫したエラー メッセージを表示します。
私の質問に対する答えは、「いいえ、定数インデックスを持つ定数配列への配列参照であっても、コンパイル時に定数であると想定することはできません」だと思います。これは、インテル コンパイラーの正常な実行がインテル コンパイラーのバグであることを意味しますか?