C++ 限定名称查找
- 限定名称查找规则实际归纳下来很简单,先对::左边的名称进行查找(遵循,限定,无限定),然后在左边查找到的(此时只查找类型名称)名字的作用域内(含内联名称空间件)查找右边出现的名字,查找到即存在(故可以避免二义访问,名称隐藏,以及多态,还有注入类类名查找),否则出错,并且,对于一个出现在声明器上的无限定名称查找,会对当前声明器的所有名字都进行限定查找,例:
const int DD = 100;
class N{
static int S[DD];
static const int DD = 50;
};
int N::S[DD]{};//错误,此时的DD是N::DD,而不是声明的::DD;
- ,但是对于以下,存在特殊情况:
- ::后是~的后接标识符,那么此时将在左边的名称空间内查找析构函数(或伪析构)
- 当::后的名字和左边的相同,那么为构造函数,此时若处于using 之后,则意为无视访问限定可查找到基类所有构造函数,当且仅当,前面存在详细类型指定符时,为类型,即为注入类名
- ::后若为operator的转换类型,则其后的类型ID优先在前面的范围内查找,查找不到则在当前作用域按无限定名称查找,但是,此时两个作用域内的转换目标必须一致,例:
class D{ public: operator double(){ return 1; } }; class C{ using DS = double; //using DS = int; 错误 public: friend D::operator DS(); };
- ::后为模板(类,函数等),模板实参查找在当前作用域内按无限定名称查找方式进行
- 对于一个声明,若是按照不同的空间方式查找得到,但是查找到的都是同一声明,那么无异议.