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 );
.....
3这里,名称C0,C1等表示此特定枚举类型的枚举元素。所有这些元素都有不同的价值。
其中一个“枚举类型”是来自ios_base类的“seekdir”(27.5.3 Class ios_base):
// 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枚举中可以有任何基础整数类型)没有那些静态常量成员可能比整数类型实现更差?
答案 0 :(得分:6)
当编写标准时,强类型枚举不可用,并且普通enum
的问题是,它们的内部类型未指定,并且可能更改,具体取决于编译器开关。
对于seekdir
,它可以是int
或byte
(作为示例),两者都是有效的表示形式。 GCC有一个命令行选项(--short-enums
或-fshort-enums
),默认情况下它会将int
用作所有enum
s作为最小类型,但是可以选择它将使用可包含所有值的最小类型。
这意味着如果在函数签名中使用了真正的enum
,则符号可能会更改,您需要重新编译所有内容。这就是为什么标准允许其他选项,为什么标准库实现控制类型的重要性,这就是允许它采用特定整数类型的原因。
答案 1 :(得分:3)
要求对象提供枚举类型值的原因是您可以获取其地址。这总是让我感到愚蠢,但在标准化的早期阶段有相当多的过度设计。