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

C++ 空枚举(枚举{};)是否可移植?,c++,C++,此空枚举定义是否可移植?在GCC和MSVC中编译.< /P> < P>,在C++标准的第7条第3段中具体列出了这样的枚举。 格式不正确。gcc不接受它。gcc中对此有一个错误修复: < P>根据下面的C++标准片段,我们可以推断它确实是一个有效的陈述: 7.2/1枚举声明(C++03)…… 枚举说明符: 枚举标识符opt{enumerator listopt} 请注意,标识符和枚举器列表都是可选的,因此enum{}语句是有效的(如果您询问标准) 但是标准不也说空声明格式不正确吗? 是的,甚至

此空枚举定义是否可移植?在GCC和MSVC中编译.< /P> < P>,在C++标准的第7条第3段中具体列出了这样的枚举。 格式不正确。gcc不接受它。gcc中对此有一个错误修复:


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

7.2/1枚举声明(C++03)
……
枚举说明符:
枚举标识符opt{enumerator listopt}

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


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

是的,甚至还有一个
enum{}的例子

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

在这些情况下,无论何时使用类说明符或枚举说明符 decl说明符seq中存在这些说明符中的标识符 在声明所声明的名称中(作为类)- 名称、枚举名称或枚举数,具体取决于语法)

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

*范例[

*[结束示例]


结论

仔细阅读标准后,该声明似乎格式不正确,尽管编译器是由人类编写的,人类往往会犯错误,有时会忽略一些事情



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

您使用它的目的是什么?在一个宏中,它可能有一个空参数,而不仅仅是一个空枚举,它是一个匿名的空枚举,正如其他答案中所说,它的格式不正确,因为它没有声明任何内容。因此,空枚举是有效的,无效的是匿名空枚举。您可以同时声明
enum{A}
enum e{}
,这两种声明都是有效的。我错过了。语法允许这种形式,但在章节标题中,有一个具体的禁止,实际上,任何不声明类型或实体(变量、函数或引用)的声明。“Nawaz Weaselox引用的段落出现在C++98、C++03和C++11中,未作任何更改,并使用了这个确切的示例。但正如Weaselox指出的那样,§7/3中的所有声明都有一个通用语义约束,有效地禁止了没有声明任何内容的声明。它给出的一个例子是
enum{}
@JamesKanze答案更新,谢谢你提醒我,我完全忘记了
7.1/3
@refp我也错过了,直到weaselox指出。(本节为§7/3,而非§7.1/3。)@refp:7(声明)和7.1(规范)是不同的章节。7.1/3是关于一些表示
int
@interjay true的说明符的注释,哈哈,我现在太累了。。病了几天(借口)。后期编辑。
class Test
{
  enum{};
  ...
};
 enum { };          // ill-formed
 typedef class { }; // ill-formed