成员名称查找规则

时间:2014-06-18 19:50:24

标签: c++ class language-lawyer

秒。 10.2描述了成员名称查找规则:

10.2 / 3:

  

C中f的查找集,称为S(f,C),由两个组件组成   sets:声明集,一组名为f的成员;和子对象   set,一组子对象,其中声明了这些成员(可能   发现包括使用声明在内。在声明集中,   using-declarations由他们指定的成员替换,和   类型声明(包括inject-class-names)被替换为   他们指定的类型。 S(f,C)计算如下:

10.2 / 4:

  

如果C包含名称f的声明,则声明集   包含在C中声明的满足f的每个声明   查找发生的语言结构的要求。

考虑以下两个例子:

class A
{
    void foo(){ A::a; } //S(a, A)={ static const int a; }
    static const int a = 5;
}

class A
{
    int b[A::a]; //S(a, A) is empty and the program is ill-formed
    static const int a = 5;
}

实际的S(f,C)计算规则是什么?为什么?

1 个答案:

答案 0 :(得分:2)

对于这些代码段

class A
{
    void foo(){ A::a; } //S(a, A)={ static const int a; }
    static const int a = 5;
};

class A
{
    int b[A::a]; //S(a, A) is empty and the program is ill-formed
    static const int a = 5;
};

您应该考虑标准3.4 Name lookup部分中描述的名称查找。它们与您引用的引号没有任何共同之处。虽然我可以在第一个类定义中显示名称为A :: a的S(f,C)。所以S(a,A)仅仅来自一个声明static const int a = 5

考虑到在第二个类定义中找不到名称A::a,因为它必须在使用之前声明。

另一个规则用于成员函数中的名称查找。在第一个类定义中,将找到名称A :: a。

我所指出的所有这些都在标准的第3.4节中描述。​​

至于你引用的短语,那么更合适的例子将是例如以下

struct A
{
   void f( int );
};

struct B : A
{
   using f;
   void f( char );
};

在这种情况下,如果搜索名称f,则S(f,B)将包含两个声明

using f; // or void f( int );

void f( char );