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