C ++ 11“枚举类型”(17.5.2.1.2)

时间:2013-03-31 08:47:36

标签: c++ c++11 enums

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

2 个答案:

答案 0 :(得分:6)

当编写标准时,强类型枚举不可用,并且普通enum的问题是,它们的内部类型未指定,并且可能更改,具体取决于编译器开关。

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

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

答案 1 :(得分:3)

要求对象提供枚举类型值的原因是您可以获取其地址。这总是让我感到愚蠢,但在标准化的早期阶段有相当多的过度设计。