sizeof(enum)是否可以与sizeof(std :: underlying_type <Enum> :: type)不同?


16

最近出现在以下示例中的代码审查中:

enum class A : uint8_t
{
    VAL1, VAL2 
};

...
std::vector<A> vOfA; // Assume this is sized and full of some stuff.
std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A));

我们应该使用sizeof(std::underlying_type<A>::type)而不是sizeof(A)这些可能会有所不同吗?有人提供标准报价来保证这一点吗?


链接C ++中枚举类型数据的大小是多少?(也应涵盖范围内的对象:-)。
橡子

3
即使它们的大小相同(这种可能性更大),反对使用的论据是什么sizeof(A)?另外:如果它们的大小不同(不太可能),则使用sizeof(std::underlying_type<A>)将是完全错误的。
桑德·戴克

1
sizeof(std::underlying_type<A>)大概是1。你是说::type
LF

1
@SanderDeDycker是的,当处理As时,一定要使用它sizeof(A),并且代码不必关心哪种类型A
橡子

@LF Yep,错字。标题正确。
很棒的狐狸先生

Answers:


12

在C ++ 03中,可以保证(好吧,无论如何,对于无范围的枚举)。

[dcl.enum] 枚举声明(强调我的)

6枚举的基础类型是整数类型,可以表示枚举中定义的所有枚举器值。如果没有整数类型可以表示所有枚举数,则枚举格式不正确。由实现定义的,哪种整数类型用作枚举的基础类型,除非该基础类型不得大于int,除非枚举器的值不能适合int或unsigned int。如果枚举数列表为空,则基础类型就像枚举有一个值为0 sizeof()sizeof()单个枚举数应用于枚举类型,枚举类型的对象或枚举类型的值是应用于枚举类型的值。基础类型

然后出现了n2347,该论文被用于强类型枚举(enum class)和其他对无范围枚举的增强,并且将粗体句子删除。有趣的是,该提案的早期版本n2213替换了删除的句子。但这并没有纳入所采用的版本。

因此,在现代C ++中,大小不必相同。尽管从实际的角度来看,实现不太可能改变C ++ 03为枚举大小指定的行为。

可以认为这是标准的缺陷。


2
在C ++ 03中,如何保证某种语言中不存在的功能?oO
轻轨赛于

4
@LightnessRaceswithMonica-基础类型的概念不是新概念。只是C ++ 11允许您自己指定它。
StoryTeller-Unslander Monica,

我知道。范围枚举(enum class)的概念是新的。
Lightness Races in Orbit

@LightnessRaceswithMonica-我认为有人可能会在这里错误地提议。它做了两件事,引入了范围内的枚举,并允许所有枚举(不仅是范围内的枚举)都设置了其基础类型。因此是C ++ 03中的“保证”。
StoryTeller-Unslander Monica,

1
@ StoryTeller-UnslanderMonica是的,问题是我认为相同的,无论是范围内还是范围外。
很棒的狐狸先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.