为什么C ++标准为模板定义了两个阶段查找?非依赖声明和定义的查找是否也可以推迟到实例化阶段?
答案 0 :(得分:32)
他们可以。这是模板的早期实现方式
工作,仍然是Microsoft编译器的工作方式。感觉到了
(在委员会中)这太容易出错;它太容易了
意外地劫持了一个名字,在一个翻译中实例化
单位拾取本地名称,而不是所需的全局符号。 (一个
典型的翻译单元将包含一系列#include
s,
声明每个人都应该看到的名字,然后是实施
码。在实例化的时候,一切都在前面
即时可见,包括实现代码。)
最后的决定是将模板中的符号分为两类
类别:依赖和非依赖,并坚持认为
非依赖符号可以在定义时解决
模板,以减少他们意外受某些人约束的风险
本地实现符号。再加上要求指定
适用于相关符号的typename
和template
还允许在定义点进行解析和一些错误检查
模板,而不仅仅是模板实例化时。
答案 1 :(得分:1)
这可以被视为separation of concerns的应用。
在第一阶段,它只检查正确的语法,并解析非依赖名称,如here所述。在第二阶段,它执行更多模板特定的操作,验证调用是否对特定类型有效。见[回答](Two phase lookup - explanation needed)
此外,如果只在一个阶段完成,那么应该在每个实例中完成。这种方式只进行一次。
如果仅在第一个实例化时进行,那么它将是相同的,只是结构较少。