模板非类型参数

Chu*_*dad 11 c++ templates arguments linkage c++11

$ 14.3.2 - "...非类型,非模板模板参数的模板参数应为以下之一:

...一个常量表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址,或具有外部或内部链接的函数......"

在下面显示的代码中,我无法理解为什么'name2'和'name3'不允许作为非类型模板参数.我在Windows上使用gcc 4.7.2.

'name2'和'name3'都是数组的名称,因此是常量表达式.'name2'具有内部链接,'name3'具有静态和内部链接.

template<char const *p> void f()
{

}

char name1[] = "Hi";
static char name2[]= "Hi";
const static char name3[]= "Hi";
char *name4 = "Hi";

int main()
{
    f<name1>();
    f<name2>();
    f<name3>();
    f<name4>();
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*k T 5

正如@Nawaz正确猜测的那样,这是一个实现错误,而不是标准的深奥角落.

具体来说,gcc似乎遇到了麻烦.除了name4违反标准的最后一个,其余部分用clang编译好

  • @Nawaz当然可以.责备R. Martinho在聊天中,他误解了我.;-) (2认同)