枚举的底层int是否有保证宽度?

tow*_*owi 1 c++ enums

在N2347的示例中,如果新的强类型枚举(C++ 11)与当前(C++ 03)进行比较,则可以通过"旧"枚举的示例来解释:

enum Version { Ver1 = 1, Ver2 = 2 };
struct Packet {
    Version ver;
    // ... more data ...
    // bad, size can vary by implementation
   Version getVersion() const { return ver; }
};
Run Code Online (Sandbox Code Playgroud)

我想知道:这里的"变化"意味着编译器甚至可以选择8位表示,即枚举元素只占用一个单词?或者是否保证最小长度,并且选择可能只在int和之间long

换句话说,如果我有这样的Version枚举:

enum VersionXyz { Ver1 = 100, Ver2 = 200 };
struct Packet {
    VersionXyz ver;
    // ... more data ...
};
Run Code Online (Sandbox Code Playgroud)

难道这往往只8bitPacket.并在软件更新后:

enum VersionXyz { Ver1 = 100, Ver2 = 200, Ver3=300 };
Run Code Online (Sandbox Code Playgroud)

现在Packet已经不再相同了,因为枚举已经增长了?

Mat*_*Mat 6

C++ 03标准的相关段落是§7.2.5:

枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.它是实现定义的,其中整数类型用作枚举的基础类型,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int.如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器.应用于枚举类型,枚举类型的对象或枚举器的sizeof()的值是sizeof()应用于基础类型.

所以它是实现定义的.你唯一能保证的是,如果你定义一个所有值都适合int的枚举,那么枚举类型的大小不会大于int.(但是因为它int的大小也是实现定义的,所以不会给你太多.)