将指针转换为模板参数:Comeau& MSVC编译,GCC失败

时间:2009-09-13 15:38:21

标签: c++ templates gcc compiler-construction

请考虑以下代码:

template<int* a>
class base {};

int main()
{
    base<(int*)0> test;
    return 0;
}

Comeau和MSVC编译时没有问题(关于未使用变量的Comeau警告除外),而GCC在base<(int*)0> test;行上失败,说明

  

在函数`int main()'中:   转换为整数或枚举类型以外的类型不能出现在常量表达式

中      

模板参数1无效

究竟是什么抱怨的?谁是对的 - 这段代码应该编译吗?值得注意的是,我的GCC版本非常旧(3.4.2),因此可能与它有关。感谢。

1 个答案:

答案 0 :(得分:8)

draft standard(强调添加):

14.1.3 A non-type template-parameter shall have one of the following (option-
  ally cv-qualified) types:
  ...
  --pointer to object, accepting an address constant  expression  desig-
    nating a named object with external linkage,
  ...

显然,使用空指针实例化模板是不合法的,因为空指针不指向“具有外部链接的命名对象”。