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
根据以下来自 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 { };,即使它编译