首页 > 解决方案 > sizeof(enum) 可以不同于 sizeof(std::underlying_type::类型)?

问题描述

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

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++language-lawyer

解决方案


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

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

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

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

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

人们可以认为这是标准中的一个缺陷。


推荐阅读