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

  • 本文关键字:可移植 枚举 enum c++
  • 更新时间 :
  • 英文 :

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

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

这样的枚举在C++标准第7条第3款中特别列为格式不正确。海湾合作委员会不接受。GCC 中对此有一个错误修复:

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

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

7.2/1 枚举声明 (C++03(
...
枚举说明符:
       enum identifieropt { enumerator-listopt }

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


但是标准不是也说空声明格式不正确吗?

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

7/3 说明符 (C++03(

在这些情况下,每当类说明符或枚举说明符 存在于 decl-specifier-seq 中,这些说明符中的标识符 是声明声明的名称之一(作为类 名称、枚举名称或枚举器,具体取决于语法(。

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

*示例 [

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

*结束示例]


结论

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


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

最新更新