在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)
难道这往往只8bit在Packet.并在软件更新后:
enum VersionXyz { Ver1 = 100, Ver2 = 200, Ver3=300 };
Run Code Online (Sandbox Code Playgroud)
现在Packet已经不再相同了,因为枚举已经增长了?
C++ 03标准的相关段落是§7.2.5:
枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.它是实现定义的,其中整数类型用作枚举的基础类型,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int.如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器.应用于枚举类型,枚举类型的对象或枚举器的sizeof()的值是sizeof()应用于基础类型.
所以它是实现定义的.你唯一能保证的是,如果你定义一个所有值都适合int的枚举,那么枚举类型的大小不会大于int.(但是因为它int的大小也是实现定义的,所以不会给你太多.)
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |