【发布时间】:2013-03-31 08:47:35
【问题描述】:
引用 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 成员的唯一原因是因为“枚举类型”允许实现为整数类型(即,当 enumerated 为 int 时,我们需要在适当位置定义常量枚举数),对吧?
问题 1。如果库供应商决定将 seekdir 实现为枚举,他是否仍需要为枚举值定义静态常量?
问题 2。为什么首先允许“枚举类型”实现为整数类型? IE。当没有这些静态常量成员的枚举实现(并且在 C++11 中枚举可以具有任何底层整数类型)可能比整数类型实现更糟糕时?
【问题讨论】:
-
额外问题:为什么在
ios_base的概要中使用static constexpr fmtflags beg = unspecified ;而不是static constexpr seekdir beg = unspecified ;? - 我刚刚向标准组的人报告了这件事,似乎是一个错字。 -
@Daniel “向标准的人报告了这一点” - 很酷,你是怎么做到的? :) 另外,TBH,即使在复制粘贴那句话之后,我自己也没有注意到那个错字。
-
我给标准封面页上给出的地址写了一封电子邮件。我猜对于这样一个明显的错字应该足够好。一般来说,你应该关注these guidelines。
-
@DanielFrey - 标准的封面上没有电子邮件地址。我假设您的意思是您用作实际标准的替代品的草案。
-
@PeteBecker:哎呀,正确 :)