成员名查找规则
Member name lookup rules
第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 );
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 此代码是否违反一个定义规则
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 假设声明中某些上下文中需要的名称查找规则是什么
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 哪里定义了查找名称最直接声明的名称查找规则
- 如何让叮当揉捏两相查找的规则
- 哪个查找规则阻止编译器查找函数
- 模板功能中的名称查找规则
- 在C++11中查找运算符的规则
- 成员名查找规则
- 嵌套名称说明符的名称查找规则
- 什么名称查找规则适用于静态 const 数据成员定义中的名称
- 查找规则多边形的顶点
- x / y的确切名称查找规则是什么?