派生到模板参数的基本转换

时间:2014-12-23 17:41:05

标签: c++ templates derived-class

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。 ]

为何适用此类限制?

1 个答案:

答案 0 :(得分:2)

2个理由恕我直言:

  1. 直到链接时才知道地址。在做出任何模板扩展决定之后,这很好。实际上,在与位置无关的代码中,地址直到运行时才知道。

  2. (type *)0和int(0)之间存在长期的歧义。 c ++ 11使用nullptr值nullptr_t class来解决这个问题。