【问题标题】:List of C++ name resolution (and overloading) rulesC++ 名称解析(和重载)规则列表
【发布时间】:2011-11-14 12:46:47
【问题描述】:

在哪里可以找到符合 C++ 标准的编译器必须应用的规则列表才能执行名称解析(包括重载)?

我想要自然语言算法或流程图之类的东西。

C++ 标准当然有这一套规则,但它是随着新语言语句的引入而建立起来的,结果很难记住。

长话短说,我想知道对“编译器在看到名称 'A' 时会做什么?”这个问题的完整而详细的答案

我知道 C++ 就是“我们在 X 时这样做,但在 Z 成立时不这样做”所以,我在问是否有可能使它更线性。

编辑:我正在起草这个主题的草稿,一旦发布,可能会集体改进。但是,我这几天很忙,可能需要一些时间才能发布一些内容。如果有人感兴趣,我会将“原始 txt 文件上的个人笔记”推广到更好的内容并发布。

【问题讨论】:

  • C++ 模板的附录 B - 完整指南 是关于重载解决方案的。 “在本附录中,我们对重载解决规则进行了相当详细的调查。但是,由于此过程的复杂性,我们并未声称涵盖该主题的所有部分。”
  • 确实,标准中的规则在整个文档中是分散的并且高度耦合。
  • 我将在这个问题可用时为其添加赏金,我希望认真参考名称查找和重载解析规则,比标准更具可读性。
  • 我想指出,该过程分为两个不同的阶段。 1.名称查找/ 2.重载分辨率。这个问题已经很宽泛了,我觉得如果把它分成两部分会更有说服力。我认为它们(无论如何)是独立应用的,重载决议只发生在查找名称的集合上。
  • @Matthieu M. 这是真的。重载作用于名称解析的结果(尽管名称查找在找到第一个可能的多个名称的范围内结束)。然而,我的意图是两者都有一个(大)数字。

标签: c++ rules token-name-resolution


【解决方案1】:

嗯,概括地说:

  • 如果名称以:: 开头,如::AX::A,则使用限定名称查找。首先查找X,如果它存在(如果不使用全局命名空间),然后在其中查找A。如果X 是一个类,而A 不是直接成员,则查看X 的所有直接基类。如果A 在多个基地中被发现,则失败。

  • 否则,如果名称被用作函数调用,例如A( X ),请使用依赖于参数的查找。这是困难的部分。在声明了X 类型的命名空间中查找A,在X 的朋友中查找X 是否是模板实例化,同样对于所有涉及的参数。仅由 typedef 关联的范围不适用。除了不合格的查找之外,还要执行此操作。

  • 如果与参数相关的查找不适用,则从 非限定查找 开始。这是找到变量的常用方法。从当前范围开始,向外工作,直到找到名称。请注意,这尊重 using namespace 指令,而其他两种情况则不这样做。

只需浏览一下标准,就会发现许多异常和陷阱。例如,在使用 ADL 生成潜在重载列表之前,非限定查找用于确定名称是否用作函数调用,而不是强制转换表达式。非限定查找不会在嵌套的本地类的封闭范围内查找对象,因为此类对象在引用时可能不存在。

运用常识,并在直觉失败时(通常如此)提出更具体的问题。

【讨论】:

  • 唉,这远不是整个论点的全貌。注意:你写的“then look in all the direct bases of A”,你的意思是“then look in all the BASES of A”吗?
  • @knm:我的意思是,从 A 的直接基类开始,然后对于每个基类,递归到它的基类。如果此搜索的任意两个分支找到 X,则该过程失败。
  • @knm241:已修补,X 是正在搜索的类(范围),A 是正在搜索的元素。
  • X 类的基类的基类是X 的间接基类。按照标准:) 再次感谢大家花时间回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多