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 ;
and
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 中,枚举可以具有任何基础整数类型)没有这些静态常量成员时,可能比整数类型实现更差吗?
ios_base
的概要中说“static constexpr fmtflags beg = unspecified;”而不是“static constexpr seekdir beg = unspecified;”? - 我刚刚向标准委员会报告了这个错别字。 - Daniel Frey