2010-11-04 65 views
2

$ 10.2/4「[注:尋找一個名字在 精心設計的類型說明符(3.4.4) 或鹼符(第10條),爲 例如,忽略所有無類型 聲明,同時在嵌套名稱說明符中查找名稱 (3.4.3) 忽略函數,變量和 枚舉數聲明。名稱查找澄清

我發現這個說法在描述名稱查找的過程中很混亂。

void S(){} 

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

int main(){ 
    struct S *p = new struct ::S; // here ::S refers to type 
    p->::S::f(); 

    S::x; // base specifier, ignores the function declaration 'S' 

    ::S(); // nested name specifier, ignores the struct declaration 'S'. 
    delete p; 
} 

我的問題:

  1. 是我對規則的理解是否正確?

  2. 爲什麼::S上線做新的自動處理,意味着結構S,而在最後一行::S裝置的功能,在全局命名空間S

  3. 這是否意味着文檔中的含糊不清或者是否還有一天讓我遠離C++標準文檔?

+2

Ouch。編譯器應該在第3行左右停下來,並告訴你重構你的代碼。 – 2010-11-04 06:05:44

+0

@Greg Hewgill:哦,誓言!編譯器和重構。創新是最好的! – Chubsdad 2010-11-04 06:10:34

+0

>>我還有一天離開C++標準文檔嗎? - 是的。 – 2010-11-04 08:06:03

回答

0

您誤會了第二條評論。在S::x中,S是嵌套名稱說明符中的名稱。什麼標準指的是與「基地 - 符」是以下

namespace B { struct X { }; void X() } 
struct A : B::X { }; // B::X is a base-specifier 

你也是不正確一下:

::S();//嵌套名指定中,忽略了結構聲明中的「S」 .`

該代碼調用該函數不是因爲::S將是一個嵌套的名稱說明符(它不是一個嵌套的名字 - 符!),但由於功能南如果函數和類/枚舉都在相同的作用域中聲明,則隱藏類或枚舉名稱。

FWIW,下面的代碼將同樣適用於第2行中的主

p->S::f(); 

什麼重要的是,S preceedes一個::,這使得查找忽視的作用。你把::之前S對你的情況沒有影響。