枚举成员类型仍然依赖于实现

Is enum members type still implementation-dependent?

本文关键字:依赖于 实现 类型 枚举成员      更新时间:2023-10-16

我读过一些关于c++ 11的文章,但没有一篇提到枚举成员的大小是否与实现相关保持不变。

  1. 现在还是这样吗?
  2. 如果是,使用enum class Token : int { ... };显式强制编译使它们为int类型是一个好习惯吗?

如果没有为未限定作用域的枚举指定类型,则该类型是实现定义的,它可以是能够表示所有枚举值的任何类型(如果没有这样的类型,则程序是病态的)。这与c++ 11之前的所有枚举的行为相同。

如果你没有为一个有作用域的枚举指定类型,那么它有一个固定类型int。如果您愿意,可以明确指定类型,但我认为这通常不是最佳实践。

根据标准§7.2/5:

每个枚举也有一个基础类型。基础类型可以使用enum-base显式指定;如果未显式指定,则作用域枚举类型的基础类型为int

(重点)。

在这个问题上(底层类型),enumenum class/enum struct之间的标准没有任何区别。