$14.3.2 - "... A template-argument for a non-type, non-template template-parameter shall be one of:
...一个常量表达式 (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>();
}
最佳答案
正如@Nawaz 正确猜测的那样,这是一个实现错误,而不是标准的一个深奥的角落。
具体来说,gcc 似乎有问题。除了最后一个 name4
是违反标准的,它的其余部分编译得很好 clang
关于c++ - 模板非类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192936/