Jan*_*šil 6 c++ language-lawyer c++14
我经常假设枚举的大小与其基础类型的大小相同.但它是否受标准规定?
标准(C++ 14,n4296)表示每个枚举都有一个基础类型(7.2/5).该标准还说对象表示为字节序列,并且对象的大小与其表示相关:
3.9/4类型为T的对象的对象表示是由类型为T的对象占用的N个无符号字符对象的序列,其中N等于sizeof(T).
5.3.3/1 sizeof运算符产生其操作数的对象表示中的字节数.
但是,我无法在枚举的基础类型和对象表示之间找到任何关系.有没有?如果没有,那么我认为枚举的sizeof不必是其基础类型的sizeof.
所以我的问题是:
枚举的基础类型与其对象表示之间是否存在任何关系?
sizeof(std::underlying_type_t<E>) == sizeof(E)
对于任何枚举E ,标准是否真的需要?
摘自:C++ 枚举的基础类型是什么?,7.2/5 中规定的较旧的 C++ 标准:
\n\n\n\n\n枚举的基础类型是整型,它可以表示枚举中定义的所有枚举器值。使用哪种整型作为枚举的基础类型是由实现定义的,但基础类型不得大于 int,除非枚举数的值不能容纳在 int 或 int 中。无符号整数。如果枚举器列表为空,则底层类型就好像枚举具有值为 0 的单个枚举器。 sizeof() 的值应用于枚举类型,即枚举类型的对象,或枚举数,是应用于基础类型的 sizeof() 值。
\n
我能找到的最接近的draft n4606
是 7.2/7 + 8,其中指出:
\n\n\n7) 对于底层类型不固定的枚举,底层类型是一个整型,可以表示该枚举中定义的所有枚举数值。如果没有整型类型可以表示所有枚举数值,则该枚举的格式不正确。使用哪个整型作为基础类型是由实现定义的,但基础类型不得大于 int,除非枚举数的值无法容纳 int 或 unsigned int。如果枚举器列表为空,则基础类型就好像枚举具有值为 0 的单个枚举器。
\n\n8) 对于基础类型固定的枚举,枚举的值是基础类型的值。否则,对于 emin 是最小枚举数且 emax 是最大枚举数的枚举,枚举的值是 bmin 到 bmax 范围内的值,定义如下:对于两个数,设 K 为 1 xe2\x80\x99s 补码表示,0 表示 a\n 个\xe2\x80\x99 补码或符号量值表示。bmax 是大于或等于 max(|emin| \xe2\x88\x92 K, |emax|) 且等于 2M \xe2\x88\x92 1 的最小值,其中 M 是非负数整数。如果\n emin 为非负值,则 bmin 为零,否则为 \xe2\x88\x92(bmax + K)。如果 bmin 为零,则足以容纳枚举类型的所有值的最小位字段的大小为 max(M, 1),否则为 M + 1。可以定义一个枚举,该枚举的任何枚举器都未定义其值。如果枚举器列表为空,则枚举的值就好像该枚举有一个值为 0 的枚举器
\n
一方面,它看起来足够接近,另一方面,对sizeof()
操作员的具体要求被删除了。\n不过我认为可以安全地说这两个问题的答案都是肯定的。
归档时间: |
|
查看次数: |
229 次 |
最近记录: |