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

Fan*_*Fox 16 c++ language-lawyer

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

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));
Run Code Online (Sandbox Code Playgroud)

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

Sto*_*ica 12

在 C++03 中它是有保证的(好吧,无论如何对于无作用域的枚举)。

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

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

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

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

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

  • @LightnessRaceswithMonica - 基础类型的概念并不新鲜。只是C++11允许你自己指定。 (4认同)
  • C++03 中如何保证该语言中不存在的功能?oO (2认同)