这个定义
struct A {
struct B;
};
定义一个A
带有嵌套结构B
1声明的结构。的完全限定名称B
是A::B
,您可以说B
是在 的“命名空间”内A
。然后这个:
struct A::B : A { // Note I added spaces
};
是 的定义A::B
,单号:
指定它是从派生的A
。
现在,有趣的部分是A::B::A::B
。让我们剖析一下:
A::B
命名嵌套结构。
A::B::A
A
访问内部注入的类名B
。注入是由于继承。
A::B::A::B
再次命名嵌套结构B
。A
而且您可以无限继续,或者至少直到您的编译器满足其翻译限制2。
一个有趣的智力练习,但避免像实际代码中的瘟疫一样。
[class.qual]/1解释了查找的工作原理
如果限定 ID的嵌套名称说明符指定了一个类,则在该嵌套名称说明符之后指定的名称([class.member.lookup])在类的范围内查找,但列出的情况除外以下。该名称应代表该类或其基类之一的一个或多个成员(子句 [class.derived])。
上面的文字允许我们命名基类,因为[class]/2
类名也被插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。
上面清楚地表明,以完全限定名称开头A::
允许您指定成员或基类。由于A
没有基础,您只能指定A::B
(“成员类型”)。还要A::B
提名一个班级。所以我们也可以用 指定它的基数或成员,这样A::B::
我们就可以命名A::B::A
。现在冲洗并重复。
1 - 请注意,它完全是 other B
。与全局无关struct B
。
2 - 根据[implimits]/2.36建议的最小值为 256