什么是嵌套名称说明符?

Gle*_*enn 29 c++ names

相关

我想知道嵌套名称说明符究竟是什么?我在草稿中查了一下但是我能理解语法,因为我还没有学过任何编译器设计课程.

void S(){}

struct S{
   S(){cout << 1;}
   void f(){}
   static const int x = 0;
}; 

int main(){ 
   struct S *p = new struct ::S;  
   p->::S::f();

   S::x;  

   ::S(); // Is ::S a nested name specifier?
   delete p;
} 
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 35

::S是一个合格的身份证.

qualified-id中 ::S::f,S::是一个嵌套名称说明符.

在非正式方面1,一个嵌套的名字说明符是部分ID

  • 开始或者在一个最开始合格-ID或初始范围解析操作后(::)如果一个出现在最开始的ID
  • qualified-id中的最后一个范围解析运算符结束.

非常非正式1,idqual-idnonqualified-id.如果idqualified-id,它实际上由两部分组成:嵌套名称说明符后跟unqualified-id.

鉴于:

struct  A {
    struct B {
        void F();
    };
};
Run Code Online (Sandbox Code Playgroud)
  • A是一个不合格的身份证.
  • ::A是一个限定ID,但没有嵌套名称说明符.
  • A::B是一个限定ID,A::是一个嵌套名称说明符.
  • ::A::B是一个限定ID,A::是一个嵌套名称说明符.
  • A::B::F是一个合格的-ID和两个B::A::B::嵌套名称符.
  • ::A::B::F是一个合格的-ID和两个B::A::B::嵌套名称符.

[1]这是一个非常不精确的描述.用简单的英语描述语法很难......


Ton*_*roy 6

嵌套的命名空间说明符是:

nested-name-specifier :
    class-or-namespace-name::nested-name-specifier(optional)
Run Code Online (Sandbox Code Playgroud)

也就是说,名称空间和类名称的非空列表,每个名称后跟::,表示程序的整个"命名空间树"中的相对分支.例如,my_namespace::,my_namespace::inner_namespace::,my_namespace::my_class::,和my_class::.

特别注意区别于:

qualified-namespace-specifier :
    ::(optional) nested-name-specifier(optional) class-or-namespace-name
Run Code Online (Sandbox Code Playgroud)

因为嵌套名称说明符可能不是绝对的(以::引用全局作用域为前缀),而qualified-namespace-specifier可以是,但不以::.

在您的示例中,::S解析为函数::S(),而不是结构(在您在问题开头链接的问题中,Stackoverflow上讨论了此优先级规则),因此它不是嵌套的名称说明符.