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说:



为什么要施加这样的限制?

最佳答案

恕我直言的2个原因:

  • 地址直到链接时间才知道。在做出任何模板扩展决定之后,这是很好的。实际上,在与位置无关的代码中,地址直到运行时才知道。
  • (type *)0和int(0)之间存在长期的歧义。 c++ 11使用nullptr_t类的nullptr值解决了这个问题。
  • 07-28 04:37