10

引用 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 中枚举可以具有任何底层整数类型)时,可能比整数类型实现更糟糕?

4

2 回答 2

6

编写标准时,强类型枚举不可用,而 plain 的问题enum是,它们的内部类型未指定,并且可能根据编译器开关而改变。

对于seekdir,它可能是intbyte(例如),两者都是有效的表示。GCC 有一个 ( --short-enumsor -fshort-enums) 的命令行选项,默认情况下它会将int所有enums 用作最小类型,但如果使用该选项,它将使用可以包含所有值的最小类型。

这意味着如果enum在函数签名中使用实数,则符号可能会更改,您需要重新编译所有内容。这就是标准允许其他选项的原因,标准库实现控制类型很重要的原因,这就是允许使用特定整数类型的原因。

于 2013-03-31T10:42:54.437 回答
3

需要枚举类型值的对象的最初原因是您可以获取它们的地址。这总是让我觉得很傻,但在标准化的早期阶段有相当多的过度设计。

于 2013-03-31T11:27:17.267 回答