在哪里可以找到符合C++的编译器必须应用的规则列表,以便执行名称解析(包括重载(?
我想要一些像自然语言算法或流程图之类的东西。
C++标准当然有这套规则,但它是随着新语言语句的引入而建立起来的,结果很难记住。
长话短说,我想知道">当编译器看到名称'a'时,它会做什么?"这个问题的完整而详细的答案
我知道C++都是">如果Z保持,我们在X时这样做,但在Y时不这样做",所以,我想问是否有可能使它更线性。
编辑:我正在起草这个主题的草案,一旦发布,可能会集体改进。然而,我这几天很忙,可能需要一些时间才能公布。如果有人感兴趣,我会把"原始txt文件上的个人笔记"推广到更好的地方并发布。
好吧,大致来说:
-
如果名称前面是
::
,如在::A
或X::A
中,则使用限定名称查找。首先查找X
,如果它存在(如果不使用全局名称空间(,则在其内部查找A
。如果X
是一个类,而A
不是直接成员,则查找X
的所有直接基。如果在多个基站中找到A
,则失败。 -
否则,如果名称用作函数调用(如
A( X )
(,请使用参数相关查找。这是最困难的部分。在声明X
类型的名称空间中,在X
的友元中查找A
,如果X
是模板实例化,则同样查找所有涉及的参数。仅由typedef
关联的作用域不适用。除了非限定查找之外,还要执行此操作。 -
如果参数相关查找不适用,则从非限定查找开始。这是查找变量的常用方法。从当前范围开始,向外工作,直到找到名称为止。请注意,这尊重
using namespace
指令,而其他两种情况则没有。
只要浏览一下标准就会发现许多例外和问题。例如,在ADL用于生成潜在重载列表之前,非限定查找用于确定名称是否用作函数调用,而不是强制转换表达式。非限定查找不会在嵌套的本地类的封闭作用域中查找对象,因为引用时可能不存在此类对象。
运用常识,在直觉失败时(通常如此(提出更具体的问题。