代码之家  ›  专栏  ›  技术社区  ›  GRB

将指针转换为模板参数:comeau&msvc编译,gcc失败

  •  6
  • GRB  · 技术社区  · 15 年前

    请考虑以下代码:

    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 回复  |  直到 15 年前
        1
  •  8
  •   Managu    15 年前

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

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