C++模板的两阶段名称查找 - 为什么?

Xya*_*and 27 c++ templates dependent-name name-lookup

为什么C++标准为模板定义了两个阶段查找?非依赖声明和定义的查找是否也可以推迟到实例化阶段?

Jam*_*nze 33

他们可以.这是大多数早期模板实现的方式,并且仍然是Microsoft编译器的工作方式.(委员会)认为这太容易出错; 它使得偶然劫持一个名称变得太容易了,一个翻译单元中的实例化获取了一个本地名称,而不是所需的全局符号.(典型的翻译单元将由一系列#includes组成,声明每个人都应该看到的名称,然后是实现代码.在实例化时,即时点之前的所有内容都是可见的,包括实现代码.)

最后的决定是将模板中的符号分为两类:依赖符号和非依赖符号,并坚持在模板定义点解析非依赖符号,以降低他们意外受约束的风险一些本地实现符号.结合指定的要求 typename以及template何时适用于依赖符号,这还允许在模板定义时进行解析和一些错误检查,而不仅仅是在实例化模板时.

  • @Albert是的.坦率地说,我不是(现在仍然不是)在适应的解决方案上太热了.部分地,因为它并没有真正解决所有问题; 你需要系统地使用完全限定的名称,即使在今天.而且因为我发现依赖和非依赖名称之间的隐含区别有点棘手:_if_两个不同的查找确实是必要的,然后我宁愿明确指定获得依赖查找的名称,而不是它取决于论点等 (5认同)