C++ 11"枚举类型"(17.5.2.1.2)

Pow*_*mer 10 c++ enums c++11

引用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枚举中可以有任何基础整数类型)没有那些静态常量成员可能比整数类型实现更糟糕?

Dan*_*rey 6

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

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

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


Pet*_*ker 3

要求对象提供枚举类型的值的最初原因是为了获取它们的地址。我总是觉得这很愚蠢,但在标准化的早期阶段存在相当多的过度设计。