秒。 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)计算规则是什么?为什么?
答案 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 );