C ++名称parsing(和重载)规则列表

在哪里可以findC ++兼容编译器为了执行名称parsing (包括重载)而必须应用的规则列表?

我喜欢自然语言algorithm或stream程图。

C ++标准当然有这套规则,但它是在引入新的语言语句的基础上build立起来的,结果很难记住。

长话短说,我想知道“ 什么编译器在看到名字”A“时做了什么?

我知道C ++是“ 我们这样做,而不是Y,如果Z持有 ”,所以,我问是否有可能使它更线性。

编辑 :我正在研究这个话题的草稿,一旦发布可能会被集体改善。 不过,我现在很忙,可能需要一些时间来宣传。 如果有人感兴趣,我会促进“个人注意到一个原始的txt文件”更好的东西,并张贴。

那么,广泛的笔触:

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

  • 否则,如果名称被用作函数调用(如A( X ) ,则使用参数相关的查找 。 这是困难的部分。 在名称空间中寻找A ,在X的朋友中声明X的types,如果X是模板实例化,则对于所涉及的所有参数也是如此。 仅由typedef关联的作用域不适用。 除了不合格的查找之外,还要做这个。

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

简单地看一下标准将揭示许多例外和陷阱。 例如,在使用ADL生成潜在重载列表之前,使用非限定查找来确定该名称是否用作函数调用,而不是用于强制转换expression式。 非限定查找不会查找嵌套在本地类的作用域中的对象,因为这些对象在引用时可能不存在。

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