2010-11-05 77 views
26

this相关什么是嵌套名称说明符?

我想知道什么是嵌套名称说明符?我查阅了草稿,但是我可以理解语法,因为我还没有参加任何编译器设计课程。

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; 
} 

回答

33

::S合格-ID

合格-ID::S::fS::嵌套名称说明符

在非正式的术语,一个嵌套名称说明符ID的一部分

  • 开始或者在一个合格-ID的最开始或之后初始范围分辨率运算符(::)如果出现在ID
  • 的最开始处,则以最后一个范围解析运算符结束qualified-id

非常非正式,一个ID要么是合格-ID不合格-ID。如果ID限定ID,它实际上由两部分组成:嵌套名称说明符,后面跟着不合格ID

考虑:

struct A { 
    struct B { 
     void F(); 
    }; 
}; 
  • A不合格-ID
  • ::A合格代码,但没有嵌套名称说明符
  • A::B合格-IDA::嵌套名称符
  • ::A::B合格-IDA::嵌套名称符
  • A::B::F合格-ID两者B::A::B::嵌套名称符
  • ::A::B::F合格-ID两者B::A::B::嵌套名称符

[1]这是一个相当不精确的描述。很难形容纯英文文法...

+0

我觉得这个的越多,我越觉得这这不是一个很好的答案。我不知道如何用简单的术语来解释它,但仍然是完全正确的... – 2010-11-05 05:54:12

+1

Little Q:'A :: B' - >我可以说'A'是**排位结构**并且同时'A ::'是一个嵌套名称说明符? – 2012-01-07 16:43:23

6

一个嵌套命名符是:

nested-name-specifier : 
    class-or-namespace-name::nested-name-specifier(optional) 

也就是说,命名空间和类名的非空列表,每个其次是::,较程序的整个“名称空间树”中的相对分支。例如,my_namespace::,my_namespace::inner_namespace::,my_namespace::my_class::my_class::

注意特别的差异从:

qualified-namespace-specifier : 
    ::(optional) nested-name-specifier(optional) class-or-namespace-name 

在该嵌套名称说明符可以不绝对的(与::前缀来表示全局范围),而一个合格的名称空间说明符可以是,但不以::结束。

在您的示例中,::S解析为函数::S(),而不是结构(在此问题的StackOverflow中讨论的优先级规则,您在问题开始时链接到的问题),所以它不是嵌套名称符。

3

好问题!我学到了一些新的研究和实验。

你是对你的评论,::S(); //Is ::S a nested name specifier <-- Yes, Indeed!

你会来,当你开始创建命名空间来欣赏它。变量在名称空间中可以具有相同的名称,并且运算符是区分它们的区别。命名空间就像某种意义上的类,是另一层抽象。我不想让你感到名字空间。你可能不欣赏嵌套名指定在这个例子......看看这个例子:我用::count在那里我可以简单地使用count

#include <iostream> 
using namespace std; 

int count(0);     // Used for iteration 

class outer { 
public: 
    static int count;   // counts the number of outer classes 
    class inner { 
    public: 
     static int count;  // counts the number of inner classes 
    }; 
}; 

int outer::count(42);   // assume there are 42 outer classes 
int outer::inner::count(32768); // assume there are 2^15 inner classes 
           // getting the hang of it? 

int main() { 
    // how do we access these numbers? 
    // 
    // using "count = ?" is quite ambiguous since we don't explicitly know which 
    // count we are referring to. 
    // 
    // Nested name specifiers help us out here 

    cout << ::count << endl;  // The iterator value 
    cout << outer::count << endl;   // the number of outer classes instantiated 
    cout << outer::inner::count << endl; // the number of inner classes instantiated 
    return 0; 
} 

通知。 ::count引用全局名称空间。

你的情况

所以,既然S()是在全局命名空间(即它是在同一个文件或包含的文件或者它不是由namespace <name_of_namespace> { }笼罩任何一段代码声明,你可以使用new struct ::Snew struct S;取其你喜欢。

我刚刚得知这是我很好奇,想回答这个问题,所以如果你有一个更具体的和了解到的答案,请你分享:)

相关问题