代码之家  ›  专栏  ›  技术社区  ›  Chubsdad

名称查找澄清

  •  2
  • Chubsdad  · 技术社区  · 14 年前

    详细的类型说明符(3.4.4) 或基说明符(第10条),用于 实例,忽略所有非类型 声明,同时查找名称 忽略函数、变量和 枚举器声明。“

    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 在线做新的自动处理到mean struct S ,而在最后一行 ·S.公司 是指功能 S公司

    3. 这是否意味着文档中的歧义,还是我远离C++标准文档的又一天?

    2 回复  |  直到 13 年前
        1
  •  1
  •   AProgrammer    14 年前

    问题1:我想是的。

    struct 在C语言中,标记名就是一个标记名。为了能够独立使用它,您需要 typedef . 在C++中,你不需要TyPulf,这使得生活变得更容易。但是C++规则已经变得复杂,因为需要能够导入已经存在的用功能名重载标签名的C标题。典型的例子是Unix stat() 使用 struct stat* 作为论据。

    问题3:标准阅读通常很难。。。你需要知道没有其他地方可以修改你正在阅读的内容。知道怎么做的人是语言律师并不奇怪。。。

        2
  •  0
  •   Johannes Schaub - litb    14 年前

    S::x ,和 S 是嵌套名称说明符中的名称。该标准所指的“基说明符”如下

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

    ::S(); //嵌套名称说明符,忽略结构声明“S”`

    代码调用函数不是因为 ::S

    FWIW,下面的代码对main的第2行同样有效

    p->S::f();
    

    S公司 方案a :: ,这使得查找忽略该函数。你放的 之前 对你的案子没有影响。