请考虑以下代码:
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),因此可能与它有关。感谢。
答案 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, ...
显然,使用空指针实例化模板是不合法的,因为空指针不指向“具有外部链接的命名对象”。