2010-11-04 64 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对你的情况没有影响。