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