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

时间:2012-09-24 08:44:24

标签: c++ templates name-lookup

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

2 个答案:

答案 0 :(得分:32)

他们可以。这是模板的早期实现方式 工作,仍然是Microsoft编译器的工作方式。感觉到了 (在委员会中)这太容易出错;它太容易了 意外地劫持了一个名字,在一个翻译中实例化 单位拾取本地名称,而不是所需的全局符号。 (一个 典型的翻译单元将包含一系列#include s, 声明每个人都应该看到的名字,然后是实施 码。在实例化的时候,一切都在前面 即时可见,包括实现代码。)

最后的决定是将模板中的符号分为两类 类别:依赖和非依赖,并坚持认为 非依赖符号可以在定义时解决 模板,以减少他们意外受某些人约束的风险 本地实现符号。再加上要求指定 适用于相关符号的typenametemplate 还允许在定义点进行解析和一些错误检查 模板,而不仅仅是模板实例化时。

答案 1 :(得分:1)

这可以被视为separation of concerns的应用。

在第一阶段,它只检查正确的语法,并解析非依赖名称,如here所述。在第二阶段,它执行更多模板特定的操作,验证调用是否对特定类型有效。见[回答](Two phase lookup - explanation needed

此外,如果只在一个阶段完成,那么应该在每个实例中完成。这种方式只进行一次。

如果仅在第一个实例化时进行,那么它将是相同的,只是结构较少。