为什么我们不能通过class-member-access表达式使用嵌套类型?

6 c++ types

我试图理解为什么我们不能通过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)

DEMO

标准说:

部分 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),嵌套类型和枚举器.

所以我看不到嵌套类型的这种用法的限制.为什么不?

use*_*267 5

再看一下[expr.ref]

(4.4)如果E2是嵌套类型,则表达式E1.E2是不正确的.