【发布时间】:2017-11-22 21:25:04
【问题描述】:
我经常假设枚举的大小与其底层类型的大小相同。但这是标准规定的吗?
标准 (C++14, n4296) 规定每个枚举都有一个基础类型 (7.2/5)。该标准还说对象被表示为字节序列,并且对象的大小与其表示有关:
3.9/4 T类型对象的对象表示是N的序列 类型 T 的对象占用的 unsigned char 对象,其中 N 等于 大小(T)。
5.3.3/1 sizeof 运算符产生对象中的字节数 其操作数的表示。
但是,我无法找到枚举的基础类型和对象表示之间的任何关系。有没有?如果不是,那么我认为枚举的 sizeof 不必是其底层类型的 sizeof。
所以我的问题是:
枚举的基础类型与其对象表示之间是否存在任何关系?
标准是否真的要求
sizeof(std::underlying_type_t<E>) == sizeof(E)用于任何枚举 E?
【问题讨论】:
-
我 99% 确定它们的大小必须相同。例如。有
std::byte,就是enum class byte : unsigned char(不记得有符号或无符号),而且保证大小相同。不过,我不确定它在标准中的位置。 -
否则会是什么尺寸?
-
@NeilButterworth 更大吗?它必须至少和 UT 一样大,因为它必须存储它的所有值。
-
我认为有些参数说它可能更小 - 例如,如果一个枚举只有两个值,它可以存储在一个 char 中,但指定的基础类型可能是一个 int。请注意,我不是说这就是发生的事情。
-
@NeilButterworth 对于普通的旧 C 枚举(也就是 UT 不固定的无范围枚举)来说,这可能是正确的。
标签: c++ c++14 language-lawyer