2010-11-05 105 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;取其你喜歡。

我剛剛得知這是我很好奇,想回答這個問題,所以如果你有一個更具體的和了解到的答案,請你分享:)

相關問題