C+的两阶段名称查找+;模板-为什么? 为什么C++标准定义了两个阶段的模板查找?非依赖声明和定义的查找不能也推迟到实例化阶段吗?
这可以看作是的一个应用程序 在第一阶段,它只检查语法是否正确,并解析非依赖名称,如前所述。在第二阶段,它会做一些更特定于模板的事情,验证调用是否对特定类型有效。看到这个[答案]() 此外,如果它只在一个阶段中完成,那么它应该在每个实例化中完成。这种方法只做一次C+的两阶段名称查找+;模板-为什么? 为什么C++标准定义了两个阶段的模板查找?非依赖声明和定义的查找不能也推迟到实例化阶段吗?,c++,templates,name-lookup,dependent-name,C++,Templates,Name Lookup,Dependent Name,这可以看作是的一个应用程序 在第一阶段,它只检查语法是否正确,并解析非依赖名称,如前所述。在第二阶段,它会做一些更特定于模板的事情,验证调用是否对特定类型有效。看到这个[答案]() 此外,如果它只在一个阶段中完成,那么它应该在每个实例化中完成。这种方法只做一次 如果只在第一次实例化时执行,那么它将是相同的事情,只是结构更少。他们可以。这是大多数早期模板实现的方式 工作,并且仍然是微软编译器的工作方式。感觉到了 (在委员会中)这太容易出错;这让我们很容易 意外劫持一个名称,并在一个翻译中实例化 单
如果只在第一次实例化时执行,那么它将是相同的事情,只是结构更少。他们可以。这是大多数早期模板实现的方式 工作,并且仍然是微软编译器的工作方式。感觉到了 (在委员会中)这太容易出错;这让我们很容易 意外劫持一个名称,并在一个翻译中实例化 单元拾取本地名称,而不是所需的全局符号。(一) 典型的翻译单元将包括一系列的
#include
s,
声明每个人都应该看到的名称,然后是实现
代码。在实例化点,在实例化点之前的所有内容
实例可见,包括实现代码。)
最后的决定是将模板中的符号分为两类
类别:依赖和非依赖,并坚持
非相关符号将在定义时解析
模板,以减少它们意外绑定到某些
本地实现符号。再加上规定的要求
typename
和template
如果适用于从属符号,则
还允许在定义点进行解析和一些错误检查
而不仅仅是当模板被实例化时。+1-这是对标准中给出的定义背后的推理的一个很好的解释,谢谢!这就是我要找的理由。所以现在本地名(比如非依赖的继承成员函数)可以被全局名劫持。“是吗?”阿尔伯特:是的。坦率地说,我当时(现在也不是)对改进后的解决方案不太感兴趣。部分原因是,它并不能真正解决所有问题;即使在今天,您也需要系统地使用完全限定的名称。另外,因为我发现依赖名称和非依赖名称之间的隐式区别有点棘手:如果确实需要两个不同的查找,那么我宁愿显式指定获得依赖查找的名称,而不是让它依赖于参数,等等@JamesKanze能否请您提供一个适当的例子,说明这将失败?相关:。另外,如果你用谷歌
msvc打破两阶段名称查找
,你会得到更多的例子。