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

Ale*_*lev 8 c++

class Test
{
  enum{};
  ...
};
Run Code Online (Sandbox Code Playgroud)

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

Wea*_*Fox 11

这样的枚举在C++标准的第7条第3款中特别列为格式错误.gcc不接受它.在gcc中有一个bug修复:

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

  • @Nawaz WeaselFox引用的段落存在于C++ 98,C++ 03和C++ 11中,没有改变,并且有这个确切的例子. (2认同)

Fil*_*efp 6

根据以下来自 c++ 标准的片段,我们可以推断出它确实是一个有效的语句:

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

请注意,标识符枚举器列表都是可选的,因此声明enum {}是有效的(如果您询问标准)。


但是标准不是也说空声明是格式错误的吗?

是的,enum { };在下面的标准片段中甚至还有一个例子。

7 /3 说明(C++03)

在这些情况下,每当 decl-specifier-seq 中出现类说明符或枚举说明符时,这些说明符中的标识符都属于声明所声明的名称(如类名、枚举名或枚举数,取决于语法)。

在这种情况下,除了特别的未命名位字段(9.6)的声明,DECL说明符-SEQ应引入一个或多个名称到程序,或应重新声明由先前声明引入的名称。

*例子 [

 enum { };          // ill-formed
 typedef class { }; // ill-formed
Run Code Online (Sandbox Code Playgroud)

*结束示例]


结论

尽管编译器是由人类编写的,但仔细查看标准后,该语句似乎格式错误——而人类往往会犯错误,有时会忽略一些事情。


TL;DR你不应该使用空声明,例如enum { };,即使它编译