为什么枚举中的元素数量会改变C++中私有typedef的可见性?

tjm*_*tjm 2 c++ enums

对不起,描述性问题标题不是很清楚.我不太清楚如何描述这一点,希望如果有人能够向我解释这一点,我可以在以后做得更好.

我即将来到这里并询问为什么以下示例正在运行.它展示了我希望的行为,但我不确定它为什么或是否是标准的,或者我是否对编译器感到幸运.无论如何,在整理一个最小的工作示例发布在这里,我发现它根本没有做我想的.所以这里......

   struct Foo {
       enum BAR { A, B, C, D, E };
       private: typedef BAR BAR;
   };

   int main(int argc, char* argv[]) {
       int x = (Foo::BAR)42;
       int y = Foo::D;
  }
Run Code Online (Sandbox Code Playgroud)

似乎正在发生的事情以及我非常高兴的是,Foo采用了枚举常量,之后BAR变为私有.所以我没有得到任何错误,int y =但我得到一个Foo::BAR私人错误int x=.然而,这似乎只适用于枚举中的5个或更多常量,删除它E并且它都编译好,即BAR保持公开.

什么在这里工作?谢谢.

(PS.编译器是GCC 4.4.3)

zil*_*n01 6

我可以验证关于四个和五个枚举元素的结果......这看起来像一个模糊的GCC错误.

至于"这里有什么用",这是由于C++中不同符号命名空间之间的技术性(继承自C).有关详细信息,请参阅此答案.

如果您不希望BAR公开名称,则只需省略标记名称:

struct Foo {
    enum { A, B, C, D, E };
};
Run Code Online (Sandbox Code Playgroud)

如果你声明一个命名的公共枚举,那么无论你做什么,即使你使用typedef隐藏名称,外人也可以使用详细的类型说明符来访问枚举.试图以这种方式隐藏符号名称是徒劳的:

 struct Foo {
     enum BAR { A, B, C, D, E };
     private: typedef BAR BAR;
 };

 int main(int argc, char* argv[]) {
     int x = (enum Foo::BAR)42;  // works great!
     int y = Foo::D;
}
Run Code Online (Sandbox Code Playgroud)

当枚举名称保持私有时,是否有任何特殊原因要让常量公开?

  • 我会避免尝试保护您的用户,尤其是在C++中.理论上的好主意,而不是在实践中.如果他们在你的类型周围肆无忌惮地投掷,他们应该得到无效的枚举状态.此外,如果他们确定了,没有什么能阻止`reinterpret_cast`. (3认同)