字符串作为模板参数

时间:2013-01-09 17:14:08

标签: c++

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

2 个答案:

答案 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