字符串作为模板参数

Strings as template arguments

本文关键字:参数 字符串      更新时间:2023-10-16

虽然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 note]

那么为什么下面的代码在所有编译器(gcc 4.7.2, MSVC-11.0, Comeau)中都给我一个错误?

template <const char* str>
void foo() {}
int main()
{
   const char str[] = "str";
   foo<str>();
}

倒带几行

14.3.2/1:一个常量表达式(5.19),指定具有静态存储时间和外部或内部链接的对象的地址。

注意,下面的修改是有效的:

template <const char* str>
void foo() {}
char str[] = "str";
int main() {
    foo<str>();
}