C++的两阶段名称查找为什么

Two phase name lookup for C++ Why?

本文关键字:查找 为什么 段名 C++      更新时间:2023-10-16

为什么C++标准定义了模板的两阶段查找?难道非依赖声明和定义的查找也不能推迟到实例化阶段吗?

他们可以。这是大多数早期模板实现的方式工作,并且仍然是微软编译器的工作方式。感觉到了(在委员会中)这太容易出错;它让它变得太容易了意外劫持了一个名称,在一个翻译中实例化单元拾取本地名称,而不是所需的全局符号。(A典型的翻译单元将由CCD_ 1s的序列组成,声明每个人都应该看到的名称,然后是实现密码在实例化时实例化是可见的,包括实现代码。)

最后的决定是将模板中的符号分为两类类别:依赖和非依赖,并坚持在模板,以降低它们意外绑定到某些本地实现符号。结合规定的要求typenametemplate,当适用于从属符号时还允许在定义时进行解析和一些错误检查而不是仅当模板被实例化时。

这可以被视为关注点分离的应用。

在第一阶段,它只是检查正确的语法,并解析非依赖名称,如本文所述。在第二阶段,它会做一些更特定于模板的事情,验证特定类型的调用是否有效。见此[答案](两相查找-需要解释)

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

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

相关文章: