class Test
{
enum{};
...
};
这个空枚举定义是否可移植?在gcc和msvc中编译。
答案 0 :(得分:10)
这样的枚举在C ++标准的第7条第3款中具体列出 病态的。 gcc不接受它。在gcc中有一个错误修复:
答案 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 { };
之类的空声明,即使它已编译