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

标签 c++ rules token-name-resolution

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

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

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

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

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

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

最佳答案

嗯,概括地说:

  • 如果名称以 :: 开头,如 ::AX::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/

相关文章:

从 Apriori 中删除倒置(反向/重复)规则会导致 R

java - 在这种情况下我应该使用 Drools 吗?

c++ - C++-如果两个库使用相同的源代码进行构建会发生什么

c++ - 将 std::string 移动到函数参数

c++ - 父进程发生了什么?

code-analysis - 有没有人为FxCop/StyleCop创建任何很酷的规则?

c++ - 全局命名空间中的保留名称

c++ - 类模板中名称解析的实际结果与c++ 03标准不同

c++ - MSVC : union vs. 具有内联友元运算符的类/结构

c++ - 为什么引用变量需要在声明时初始化