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

GRB*_*GRB 6 c++ compiler-construction gcc templates

请考虑以下代码:

template<int* a>
class base {};

int main()
{
    base<(int*)0> test;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

模板参数1无效

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

Man*_*agu 8

标准草案(重点补充):

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,
  ...

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

  • 尽管如此,引用的文本来自1996年的标准草案.标准('03)有:" - 指向对象的指针或指向函数的指针",在其他地方,它说参数应该是" - 具有外部链接的对象或函数的地址".严格按照'03的说法是错误的,虽然故意是错误的,但是"符合"尚未发布的c ++ 0x. (3认同)