C++ 应用于不完整类型变量的成员访问表达式

C++ 应用于不完整类型变量的成员访问表达式,c++,class,C++,Class,考虑以下代码: #include <iostream> struct A { static const int b = 42; static const A *a; int ca[b]; //OK int c[a -> b]; //1, ill-formed }; int main(){ } #包括 结构A { 静态常数int b=42; 静态常数A*A; int ca[b];//好的 int c[a->b];//1,格式错误 }; int

考虑以下代码:

#include <iostream>

struct A
{
    static const int b = 42;
    static const A *a;
    int ca[b]; //OK
    int c[a -> b]; //1, ill-formed
};

int main(){ }
#包括
结构A
{
静态常数int b=42;
静态常数A*A;
int ca[b];//好的
int c[a->b];//1,格式错误
};
int main(){}

//1
,类类型仍被视为不完整的对象类型(相关章节
N4296::9.2/2[class.mem]
)。但是我们不能将类成员访问表达式应用于它。为什么?


您能解释一下为什么程序格式不正确吗?

因为成员访问运算符只能应用于C++11 5.2.5[expr.ref]/2指定的完整类型:

对于第一个选项(dot),第一个表达式应具有完整的类类型。对于第二个选项(箭头),第一个表达式应具有指向完整类类型的指针

如果您问为什么存在该规则:因为,除非类是完整的,因此成员已声明,否则无法知道如何解释成员名称