是空枚举 ( enum{}; ) 可移植的
Is empty enum ( enum{}; ) portable?
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 { };
,即使它编译
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 标准::可选枚举的比较运算符
- 表达式必须是带有枚举的可修改左值
- 防止作用域枚举可复制/可移动
- C++枚举的规范是默认可构造的
- 如何使C枚举类型可用于其他语言
- 枚举可执行文件C++派生类
- 可视化 在 c++ 中使用枚举
- 是否用换行符分隔的多个枚举,然后逗号始终可移植
- 是空枚举 ( enum{}; ) 可移植的
- 是否存在可用于保存任何枚举值的整型?
- 使用枚举如何增加可执行文件的大小
- 不确定如何在头文件中实现可访问的枚举
- 枚举c++中成员的成员,或可选成员
- 是否可以使作用域枚举("enum class")在上下文中可转换为布尔值?
- 将c++代码从MS Visual Studio移植到Linux,并处理类型化枚举