2013-01-09 74 views
4

虽然C++标准不允许使用字符串文字作为模板参数,它允许这样的事情:字符串作为模板参数

ISO/IEC 14882:2011

14.3 0.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>(); 
} 
+0

+1它使用类似MSCV 6或7。但是我最后一次尝试它不再编译:-(高兴你问这个问题的工作。 –

回答

5

倒回几行。

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

4

注意下面的改装工程:

template <const char* str> 
void foo() {} 

char str[] = "str"; 

int main() { 
    foo<str>(); 
} 

一个简短的说明见http://www.comeaucomputing.com/techtalk/templates/#stringliteral

+0

你是对的,除去'const'有所帮助。不过,我认为它只是证明在代码中处理常量编译器错误,因为'为const char p [] =“”'仍然定义外部对象 – jpalecek

+0

@Cornstalks:哦,是的,'const'是很重要的位置:比较HTTP:// ideone。 COM/rY7ZWI和http://ideone.com/u4LbEC(虽然你是对不使用局部变量是必不可少的,我只是想它的变化和整个'const'东西来......) – jpalecek

+0

因此,它是编译器错误? – FrozenHeart