40 c++ rules token-name-resolution
在哪里可以找到符合C++的编译器必须应用的规则列表才能执行名称解析(包括重载)?
我喜欢自然语言算法或流程图.
C++标准当然有这套规则,但随着新语言语句的引入而逐渐形成,结果很难记住.
总而言之,我想知道" 当它看到名字'A'时编译器会做什么的完整而详细的答案?"
我知道C++就是" 我们在X时这样做,但如果Z持有则不是Y "所以,我在问是否有可能使它更加线性.
编辑:我正在研究这个主题的草稿,一旦发布,可以集体改进.然而,这些天我很忙,可能需要时间来宣传一些东西.如果有兴趣我会将"关于原始txt文件的个人笔记"推广到更好的东西并发布.
Pot*_*ter 12
嗯,粗略地说:
如果名称前面带有::
,::A
或者X::A
使用,则使用限定名称查找.首先查找X
,如果它存在(如果不使用全局命名空间),那么查看它A
.如果X
是一个类,并且A
不是直接成员,那么请查看所有的直接基础X
.如果A
在多个基础中找到,则失败.
否则,如果名称用作函数调用,例如A( X )
,使用依赖于参数的查找.这是困难的部分.A
在命名空间中查找X
声明的类型,在朋友中X
,以及if X
是模板实例化,同样适用于所涉及的所有参数.仅typedef
适用的范围不适用.除了不合格的查找之外,还要执行此操作.
如果不依赖于参数的查找,则从非限定查找开始.这是找到变量的常用方法.从当前范围开始并向外工作,直到找到名称.请注意,这表示using namespace
指令,而其他两种情况则不然.
只需看一眼该标准就会发现许多异常和陷阱.例如,不合格查找用于确定是否该名被用作一个函数调用,而不是一个铸表达,ADL用于生成潜在的过载的列表之前.非限定查找不会查找包含本地类嵌套范围的对象,因为这些对象在引用时可能不存在.
应用常识,并在(通常情况下)直觉失败时询问更具体的问题.