28

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

4

2 回答 2

33

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

最终的决定是将模板中的符号分为依赖和非依赖两类,并坚持非依赖符号在模板定义点进行解析,以减少意外绑定的风险到一些本地实现符号。再加上需要指定 typenametemplate何时适用于相关符号,这还允许在模板的定义点进行解析和一些错误检查,而不仅仅是在模板被实例化时。

于 2012-09-24T09:03:33.420 回答
1

这可以看作是关注点分离的一种应用。

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

此外,如果仅在一个阶段完成,则应在每次实例化时完成。这种方式只进行一次。

如果只在第一次实例化时完成,那么这将是相同的事情,只是结构较少。

于 2012-09-24T08:50:40.560 回答