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