空枚举(enum {};)是否可移植?

时间:2012-03-20 14:15:58

标签: c++

class Test
{
  enum{};
  ...
};

这个空枚举定义是否可移植?在gcc和msvc中编译。

2 个答案:

答案 0 :(得分:10)

这样的枚举在C ++标准的第7条第3款中具体列出 病态的。 gcc不接受它。在gcc中有一个错误修复:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29018

答案 1 :(得分:4)

根据c ++标准的以下片段,我们可以推断它确实是一个有效的陈述:

  

7.2 / 1 枚举声明(C ++ 03)
...
  枚举符:   
enum 标识符 opt { enumerator-list opt }

请注意,标识符枚举器列表都是可选的,因此enum {}的语句有效(如果您要求标准)。


但标准是否也表示空声明格式不正确?

是的,在标准的以下代码段中甚至有enum { };的示例。

  

7 / 3 说明者(C ++ 03)

     

在这些情况下以及每当使用类说明符或枚举说明符时   在decl-specifier-seq中出现这些说明符中的标识符   是宣言所声明的名称(如同   名称,枚举名称或枚举数,具体取决于语法)。

     

在这种情况下,除了声明未命名的位域之外   (9.6), decl-specifier-seq 应引入一个或多个名称   该程序,或重新声明由前一个引入的名称   声明。

     

*实施例[

 enum { };          // ill-formed
 typedef class { }; // ill-formed
  

*结束示例]


<强>结论

在仔细研究标准后,声明似乎是不正确的,尽管编译器是由人类编写的 - 而人类往往会犯错误,有时会忽视这些错误。


TL; DR 您不应使用enum { };之类的空声明,即使它已编译