虽然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
-end example] -end note]
那么为什么下面的代码会在所有编译器中给出错误(gcc 4.7.2,MSVC-11.0,Comeau)?
template <const char* str>
void foo() {}
int main()
{
const char str[] = "str";
foo<str>();
}
答案 0 :(得分:5)
倒退几行。
14.3.2 / 1:一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址。
答案 1 :(得分:4)
请注意,以下修改有效:
template <const char* str>
void foo() {}
char str[] = "str";
int main() {
foo<str>();
}
有关简短说明,请参阅http://www.comeaucomputing.com/techtalk/templates/#stringliteral。