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



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

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

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

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

我知道C++都是">如果Z保持,我们在X时这样做,但在Y时不这样做",所以,我想问是否有可能使它更线性。

编辑:我正在起草这个主题的草案,一旦发布,可能会集体改进。然而,我这几天很忙,可能需要一些时间才能公布。如果有人感兴趣,我会把"原始txt文件上的个人笔记"推广到更好的地方并发布。

好吧,大致来说:

  • 如果名称前面是::,如在::AX::A中,则使用限定名称查找。首先查找X,如果它存在(如果不使用全局名称空间(,则在其内部查找A。如果X是一个类,而A不是直接成员,则查找X的所有直接基。如果在多个基站中找到A,则失败。

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

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

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

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

最新更新