43

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

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

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

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

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

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

4

1 回答 1

12

好吧,概括地说:

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

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

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

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

运用常识,并在直觉失败时(经常这样做)提出更具体的问题。

于 2011-09-11T03:56:12.407 回答