C ++名称parsing(和重载)规则列表
在哪里可以findC ++兼容编译器为了执行名称parsing (包括重载)而必须应用的规则列表?
我喜欢自然语言algorithm或stream程图。
C ++标准当然有这套规则,但它是在引入新的语言语句的基础上build立起来的,结果很难记住。
长话短说,我想知道“ 什么编译器在看到名字”A“时做了什么?
我知道C ++是“ 我们这样做,而不是Y,如果Z持有 ”,所以,我问是否有可能使它更线性。
编辑 :我正在研究这个话题的草稿,一旦发布可能会被集体改善。 不过,我现在很忙,可能需要一些时间来宣传。 如果有人感兴趣,我会促进“个人注意到一个原始的txt文件”更好的东西,并张贴。
那么,广泛的笔触:
-
如果名称前面有
::
,如::A
或X::A
,则使用限定名称查找 。 首先查找X
,如果它存在(如果不使用全局名称空间),然后在里面查找A
如果X
是一个类,并且A
不是直接成员,那么查看X
所有直接基础。 如果在多个基地中发现A
,则失败。 -
否则,如果名称被用作函数调用(如
A( X )
,则使用参数相关的查找 。 这是困难的部分。 在名称空间中寻找A
,在X
的朋友中声明X
的types,如果X
是模板实例化,则对于所涉及的所有参数也是如此。 仅由typedef
关联的作用域不适用。 除了不合格的查找之外,还要做这个。 -
如果依赖于参数的查找不适用,则以非限定查找开始。 这是findvariables的常用方法。 从当前范围开始并向外工作,直到find名称。 请注意,这一方面
using namespace
指令,而另外两种情况则不这样做。
简单地看一下标准将揭示许多例外和陷阱。 例如,在使用ADL生成潜在重载列表之前,使用非限定查找来确定该名称是否用作函数调用,而不是用于强制转换expression式。 非限定查找不会查找嵌套在本地类的作用域中的对象,因为这些对象在引用时可能不存在。
运用常识,在(直觉经常)直觉失败的时候提出更具体的问题。
- 在使用@Retention,@Transactional,@Inherited进行注释服务的testing之后,TestNGunit testing不起作用
- 用于pipe理/托pipe自己的p2存储库的工具?