4

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>();
}
4

2 に答える 2

5

数行巻き戻します。

14.3.2/1:静的ストレージ期間と外部または内部リンケージを持つオブジェクトのアドレスを指定する定数式 (5.19) 。

于 2013-01-09T17:28:27.413 に答える
4

次の変更が機能することに注意してください。

template <const char* str>
void foo() {}

char str[] = "str";

int main() {
    foo<str>();
}

簡単な説明については、http://www.comeaucomputing.com/techtalk/templates/#stringliteralを参照してください。

于 2013-01-09T17:28:51.280 に答える