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 { };
,即使它编译