引用 C++11 标准(17.5.2.1.2 枚举类型):
1 第 27 条中定义的几种类型是枚举类型。每个枚举类型都可以实现为枚举或枚举的同义词(例如整数类型,具有常量整数值 (3.9.1))。
2 枚举类型enumerated可以写成:
enum enumerated { V0 , V1 , V2 , V3 , ..... };
static const enumerated C0 (V0 );
static const enumerated C1 (V1 );
static const enumerated C2 (V2 );
static const enumerated C3 (V3 );
.....
3 此处,名称 C0、C1 等表示此特定枚举类型的枚举元素。所有这些元素都有不同的价值。
此类“枚举类型”之一是 ios_base 类(27.5.3 ios_base 类)中的“seekdir”:
// 27.5.3.1.5 seekdir
typedef T4 seekdir;
static constexpr fmtflags beg = unspecified ;
static constexpr fmtflags cur = unspecified ;
static constexpr fmtflags end = unspecified ;
和
27.5.3.1.5 类型 ios_base::seekdir [ios::seekdir]
typedef T4 seekdir;
1 seekdir 类型是枚举类型 (17.5.2.1.2),包含表 126 中指示的元素。
因此,需要这些静态 const 和 constexpr 成员的唯一原因是因为“枚举类型”允许实现为整数类型(即当枚举为 int 时,我们需要定义常量来代替枚举器),对吧?
问题 1。如果库供应商决定将 seekdir 实现为枚举,他是否还需要为枚举值定义静态常量?
问题 2。为什么首先允许“枚举类型”实现为整数类型?即,当没有这些静态常量成员的枚举实现(并且在 C++11 中枚举可以具有任何底层整数类型)时,可能比整数类型实现更糟糕?