gpt4 book ai didi

C++11 "enumerated types"(17.5.2.1.2)

转载 作者:可可西里 更新时间:2023-11-01 16:04:52 24 4
gpt4 key购买 nike

引自 C++11 标准(17.5.2.1.2 枚举类型):

1 Several types defined in Clause 27 are enumerated types. Each enumerated type may be implemented as an enumeration or as a synonym for an enumeration (Such as an integer type, with constant integer values (3.9.1)).

2 The enumerated type enumerated can be written:

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 Here, the names C0, C1, etc. represent enumerated elements for this particular enumerated type. All such elements have distinct values.

此类“枚举类型”之一是来自类 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 Type ios_base::seekdir [ios::seekdir]

typedef T4 seekdir;

1 The type seekdir is an enumerated type (17.5.2.1.2) that contains the elements indicated in Table 126.

因此,需要这些静态 const 和 constexpr 成员的唯一原因是因为“枚举类型”允许作为整数类型实现(即,当 enumerated 是 int 时,我们需要就地定义常量的调查员),对吧?

问题 1。如果库供应商决定将 seekdir 实现为枚举,他是否仍然需要为枚举值定义静态常量?

问题 2。为什么首先允许“枚举类型”实现为整数类型? IE。什么时候没有这些静态常量成员的枚举实现(在 C++11 中枚举可以有任何底层整数类型)可能比整数类型实现更糟糕?

最佳答案

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

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

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

关于C++11 "enumerated types"(17.5.2.1.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727869/

24 4 0