【发布时间】:2023-04-07 03:49:01
【问题描述】:
考虑以下代码sn-p:
class A
{
int b[A::a]; //1, error
void foo(){ int b = A::a; } //2, ok
static const int a = 5;
}
第 3.4.3.1/1 条(合格名称查找,类成员)说:
如果限定 ID 的嵌套名称说明符指定了一个类,则 在嵌套名称说明符之后指定的名称在 类的范围(10.2)
这意味着在 //1 和 //2 中嵌套名称说明符之后的名称 a 将在类范围内查找。
第 10.2 条(会员名查找)说:
10.2/2
以下步骤定义了成员名称的名称查找结果 f 在类范围 C 中。
10.2/3
C 中 f 的查找集,称为 S(f, C)...
S(f, C) 计算如下:
10.2/4
如果 C 包含名为 f 的声明,则声明集 包含在 C 中声明的满足 f 的每个声明 查找发生的语言结构的要求。
我不清楚以下几点:
从我引用的引文中可以看出,//1 和 //2 应应用相同的成员查找规则。 但实际上它是不同的。为什么我的推理是错误的?
注意:我知道类范围内的非限定名称查找规则。我在以下代码 sn-p 中理解了这种行为:
class A
{
int b[a]; //error
void foo(){ int b = a; } //ok
static const int a = 5;
}
这是因为第 3.4.1/7 和 3.4.1/8 节(非限定名称查找)中描述的行为。
【问题讨论】:
-
这个标题只是语言特性的名称。好的标题描述了提出的问题,而不是简单地命名语言特征。见meta.stackoverflow.com/q/253766/46642
标签: c++ class language-lawyer