【问题标题】:Two phase name lookup for C++ templates - Why?C++ 模板的两阶段名称查找 - 为什么?
【发布时间】:2012-09-24 08:44:24
【问题描述】:

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

【问题讨论】:

标签: c++ templates name-lookup dependent-name


【解决方案1】:

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

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

【讨论】:

  • +1 - 很好地解释了标准中给出的定义背后的推理
  • 谢谢!正是我一直在寻找的理由。所以现在局部名称(比如非依赖继承的成员函数)可以被全局劫持。对吗?
  • @Albert 是的。坦率地说,我对适应的解决方案并没有(现在仍然不是)太热心。部分是因为它并不能真正解决所有问题;即使在今天,您也需要系统地使用完全限定名称。也因为我发现依赖和非依赖名称之间的隐含区别有点棘手:如果确实需要两个不同的查找,那么我宁愿必须明确指定依赖的名称查找,而不是让它依赖于参数等。
  • @JamesKanze 你能提供一个正确的例子吗?
【解决方案2】:

这可以看作是separation of concerns的应用。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多