C++模板实例化:原理、机制与实践
1. 模板历史与相关规则发展
在20世纪90年代中期,Taligent公司开发出了首个真正能解析模板定义的编译器。在此之前,甚至之后的一段时间,大多数编译器将模板视为一系列标记,在实例化时才通过解析器进行处理,仅做少量解析以确定模板定义的结束位置。Taligent公司的Bill Gibbons是C++委员会的代表,也是推动模板可明确解析的主要倡导者。后来,惠普(HP)收购并完善了该编译器,使其成为aC++编译器,该编译器以高质量的诊断信息而闻名,模板诊断不总是延迟到实例化时进行,这无疑有助于提升其声誉。
在模板发展的早期,Tom Pennello指出了尖括号相关的一些问题。Stroustrup在相关著作中也提到,人类更倾向于阅读尖括号而非括号。1991年,Pennello在C++标准会议上提议用花括号替代尖括号,但由于当时嵌套模板(成员模板)还不合法,该提议被委员会拒绝。
1993年,C++标准引入了非依赖名称和依赖基类的名称查找规则,并于1994年初在Bjarne Stroustrup的著作中向公众介绍。然而,直到1997年初,HP才将该规则纳入其aC++编译器中。此时,大量从依赖基类派生的类模板代码受到影响,许多使用模板的程序无法编译,特别是标准模板库(STL)的实现,在数百甚至数千处违反了该规则。为了缓解客户的过渡问题,HP对aC++编译器进行了调整:当在类模板作用域中使用标准规则未找到非依赖名称时,编译器会查看依赖基类;若仍未找到,则发出硬错误并停止编译;若找到,则发出警告,并将该名称标记为依赖名称,以便在实例化时重新查找。
此外,非依赖基类中的名称隐藏同名模板参数的查找规则可能是一个疏忽,未来标准修订时可能会改变。
C++模板实例化详解
超级会员免费看
订阅专栏 解锁全文
1607

被折叠的 条评论
为什么被折叠?



