为什么C++允许通过指针访问枚举?

Gan*_*458 4 c++

我正在研究一些类中有简单枚举的代码.另一段代码有一个指向该类的指针,并通过箭头指针访问枚举的值.

该类如何以这种方式访问​​MY_VALUE1?我虽然它只允许通过MyClass :: MY_VALUE1或MyClass :: MyEnum :: MY_VALUE1进行访问.

class MyClass {
public:
enum MyEnum{
    MY_VALUE0 = 0,
    MY_VALUE1 = 1
};
//getters, setters as appropriate
};

//Other class
MyClass* myClass = new MyClass();

//Compiles without C++11
if(getRandomEnum() == myClass->MY_VALUE1)
{
    //Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 5

->运营商(大部分)的缩写为dereference(*)和selection(.).换句话说,a->b就是一样(*(a)).b.(§5.2.5/ 2;见下面的注释).

.语法是类成员访问,通过§5.2.5[expr.ref]所定义; 右侧的标识符.可以是静态或非静态数据成员,函数或成员枚举器(引用部分的第4段).它不能是嵌套类型.从这个意义上讲,成员枚举器在语法上与static const数据成员类似.

笔记:

  1. 正如§13.5.6所阐明的那样,a->b是否受运营商超载的影响.如果a不是指针类型,则->可能会重载,在这种情况下表达式被解释为(a.operator->())->b.最终,重载->调用的序列必须产生指针类型,此时应用§5.2.5/ 2的解释.

  2. 在第二种情况下,即使没有必要解析其值,也将评估Class::member和之间的重要区别.value.membervaluemember