C++ 標準では文字列リテラルをテンプレート引数として使用することは許可されていませんが、次のようなことは許可されています。
ISO/IEC 14882:2011
14.3.2 テンプレートの非型引数 [temp.arg.nontype]
2 [ 注: 文字列リテラル (2.14.5) は、これらのカテゴリのいずれの要件も満たしていないため、受け入れ可能なテンプレート引数ではありません。[ 例:
template<class T, const char* p> class X { / ... / };
X<int, "Studebaker"> x1; // error: string literal as template-argument
const char p[] = "Vivisectionist";
X<int,p> x2; // OK
—例の終了] —注記の終了]
では、なぜ次のコードですべてのコンパイラ (gcc 4.7.2、MSVC-11.0、Comeau) でエラーが発生するのでしょうか?
template <const char* str>
void foo() {}
int main()
{
const char str[] = "str";
foo<str>();
}