struct CL1{};
struct CL2:CL1{};
template<CL1*>
struct TMPL{};
CL2 cl2;
int main()
{
TMPL<&cl2> tmpl; //error: could not convert template argument ‘& cl2’ to ‘CL1*’
return 0;
}
标准2003 14.3.2 / 5说:
对于指向对象的类型指针的非类型模板参数, 资格转换(4.4)和数组到指针的转换 (4.2)适用。 [注意:特别是,空指针都没有 转换(4.10)也不是派生到基础的转换(4.10) 应用即可。虽然0是非类型的有效模板参数 整数类型的模板参数,它不是有效的 指针类型的非类型模板参数的template-argument。 ]
为何适用此类限制?
答案 0 :(得分:2)
2个理由恕我直言:
直到链接时才知道地址。在做出任何模板扩展决定之后,这很好。实际上,在与位置无关的代码中,地址直到运行时才知道。
(type *)0和int(0)之间存在长期的歧义。 c ++ 11使用nullptr值nullptr_t class来解决这个问题。