我试图理解为什么我们不能通过class-member-access表达式使用嵌套类型.例如,我们有以下类:
struct U
{
struct A
{
static int v;
int a;
};
struct B
{
int b;
};
};
U a;
typedef a.A T; //'a' does not name a type
int main()
{
std::cout << typeid(a.A).hash_code(); //invalid use of 'struct U::A'
struct a.A b; //trying to declare a variable of type U::A
//error: expected unqualified-id before '.' token
a.A b; //the same as above
//error: expected unqualified-id before '.' token
a.A.v = 5; //error: expected unqualified-id before '.' token
}
Run Code Online (Sandbox Code Playgroud)
标准说:
部分 N3797::5.2.5/2 [expr.ref]
对于第一个选项(点),第一个表达式应具有完整的类类型.对于第二个选项(箭头),第一个表达式应具有指向完整类类型的指针.表达式E1-> E2转换为等价形式(*(E1)).E2; 5.2.5的其余部分将仅解决第一个选项(点).在任何一种情况下, id-expression都应该命名该类或其一个基类的成员.
然而,section N3797::9.2/1 [class.mem]给出了类成员的定义:
类的成员是数据成员,成员函数(9.3),嵌套类型和枚举器.
所以我看不到嵌套类型的这种用法的限制.为什么不?