繁体   English   中英

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

[英]Derived to base conversion for template argument

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是整数类型的非类型模板参数的有效模板参数,但它不是指针类型的非类型模板参数的有效模板参数。 ]

为何适用此限制?

2个原因恕我直言:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM