成员名查找规则

Member name lookup rules

本文关键字:规则 查找 成员      更新时间:2023-10-16

第10.2节描述了成员名查找规则:

10.2/3:

C中f的查找集称为S(f, C),由两个部分组成集合:声明集合,一组名为f的成员;还有主词集合,一组子对象,其中这些成员的声明(可能)包括using-declarations)。在声明集合中,using声明被它们所指定的成员替换,并且类型声明(包括注入的类名)由它们指定的类型。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)的实际计算规则是什么?为什么?

对于这些代码片段

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节中描述的名称查找。他们和你引用的那些话毫无共同之处。虽然我可以展示S(f, C)是什么,例如在第一个类定义中的名称A:: A。所以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 );