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();
    };
    
    • ::后为模板(类,函数等),模板实参查找在当前作用域内按无限定名称查找方式进行
  • 对于一个声明,若是按照不同的空间方式查找得到,但是查找到的都是同一声明,那么无异议.
posted @ 2019-03-20 12:24  KinoluKaslana  阅读(295)  评论(0编辑  收藏  举报