C++模板编程(17)---模板内名称小结

     可对template定义式进行词法分析parse的第一个编译器是taligent公司于1990s年代中期开发的。在此之前及之后,大多数编译器都把templates当作一个tokens sequence,并在实例化期间将它交给parser。因此除了小量情况是足以标示template定义结束位置,大部分时候parser都无法正常工作。Bill Gibbons是Taligent公司在C++标准委员会的代表。他是是template可被精确进行词法分析的主要贡献者。Taligent的成果一直都未公开,后来HP获得它并加以完善,并把它作为aC++编译器。

    在template技术发展前期,Tom Pennello注意到角括号带来的一些问题。sroustrup中对此作出评论,并认为相对于小括号而言,人们更喜欢角括号。然而也有人偏爱其他的符号作为template parameter list 的界定符,例如Pennello提议使用大括号List{::X}。当时这个问题并不明显,因为还不允许把一个template嵌套于另一个template中。最终委员会否决了以大括号替代尖括号。

    C++标准在1993年引入非受控名称non-dependent names和受控base classes的名称查询规则name lookup rule。Bjarne Stroustrup于1994年初向公众做了相关描述。但这个规则直到1997年才出现在它的aC++编译器中引入了这个特性。此后有大量的程序代码从受控的base classes中继承出class templates。当HP工程师开始进行测试时,他们发现大部分对template运用颇深的程序代码再也无法编译。特别是所有STL作品都违反了这个规则。为此,HP放宽了这个规则:

当根据C++标准无法找到一个class template作用域中的非控名称时,aC++会在其受控base classes中继续寻找。如果还找不到这个名称,编译器报错。然而如果在受控base classes中找到了该名称,编译器会给出一个警告,同时,该名称被标识为受控dependent。这么一来当名称被实例化时,编译器会再次查询它。

根据查询规则lookup rule,非受控base classes中的名称可能会导致编译器无法见到一个与之同名的template parameter。

    Andrew Koenig首先提议在运算符函数中使用ADL。这其实是个审美问题:明显地将运算符名称饰之以名空间的名称,委实有些笨拙(例如,我们不能写a+b,必须写成 N::operator+(a,b));而且每个运算符前面使用using声明语句,也使程序难看。因此,人们决定让编译器在查询运算符时,同时查询其实参与之相关联的namespace。

    后来ADL又被扩展,适用于查询常规函数的名称,以容许一些有限的friend 名称植入 friend name injection。并支持templates的两段式查询two-phase lookup model和实例化。这种更泛化的ADL规则又称为extended Koeing lookup。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值