引用C++ 11标准(17.5.2.1.2枚举类型):
1第27章中定义的几种类型是枚举类型.每个枚举类型可以实现为枚举或枚举的同义词(例如整数类型,具有常量整数值(3.9.1)).
2所述的枚举类型列举的可写为:
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 );
.....
Run Code Online (Sandbox Code Playgroud)
3这里,名称C0,C1等表示该特定枚举类型的枚举元素.所有这些元素都有不同的价值.
其中一个"枚举类型"是来自类ios_base(27.5.3 Class 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 ;
Run Code Online (Sandbox Code Playgroud)
和
27.5.3.1.5输入ios_base :: seekdir [ios :: seekdir]
typedef T4 seekdir;
Run Code Online (Sandbox Code Playgroud)
1类型seekdir是枚举类型(17.5.2.1.2),包含表126中指示的元素.
因此,仅需要那些静态const和constexpr成员的原因是因为"枚举类型"允许实现为整数类型(即,当枚举为int时,我们需要定义常量来代替枚举数),对吧?
问题1.如果库供应商决定以enum的形式实现seekdir,他还是要为枚举值定义静态常量吗?
问题2.为什么"枚举类型"允许首先实现为整数类型?即枚举实现(以及在C++ 11枚举中可以有任何基础整数类型)没有那些静态常量成员可能比整数类型实现更糟糕?
在编写标准时,强类型枚举不可用,并且plain的问题enum是,它们的内部类型未指定,并且可能根据编译器开关而改变.
因为seekdir,它可以是int或byte(作为一个例子),两者都是有效的表示.GCC有一个命令行选项(--short-enums或者-fshort-enums),默认情况下它将int用于所有enums作为最小类型,但是使用该选项它将使用可以包含所有值的最小类型.
这意味着如果enum在函数签名中使用了real ,则符号可能会更改,您需要重新编译所有内容.这就是为什么标准允许其他选项,为什么标准库实现控制类型的重要性,这就是允许它采用特定整数类型的原因.