c++ - 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++03 中,它得到了保证(好吧,无论如何,对于无范围的枚举)。
[dcl.enum] 枚举声明(强调我的)
6 枚举的底层类型是一个整数类型,可以表示枚举中定义的所有枚举数值。如果没有整数类型可以表示所有枚举数值,则枚举格式错误。使用哪种整数类型作为枚举的基础类型由实现定义,除非基础类型不得大于 int,除非枚举数的值不能适合 int 或 unsigned int。如果 enumerator-list 为空,则基础类型就像枚举具有单个值为 0的枚举器。
sizeof()
应用于枚举类型、枚举类型的对象或枚举器的值是sizeof()
应用于基础类型。
然后是n2347,该论文被用于强类型枚举 ( enum class
) 和其他对无范围枚举的增强,它删除了粗体字。有趣的是,该提案的早期版本n2213替换了删除的句子。但它并没有成为被采用的版本。
因此,在现代 C++ 中,没有要求大小相同的义务。尽管从实际的角度来看,实现不太可能改变 C++03 为枚举大小规定的行为。
人们可以认为这是标准中的一个缺陷。
推荐阅读
- c# - 批处理作业和电子邮件调度程序的基础知识
- html - @font-face 什么时候加载字体?
- python - 如何选择一个下拉菜单值与硒使用 python
- tcl - 从文件中逐行读取 *TCL
- rasa-nlu - 创建评估 RASA 聊天机器人问题
- javascript - 将一个按钮与另一个居中的按钮内联
- python - 不明白如何解决错误信息
- gremlin - 配置 gremlin-server 以使用 UUID 作为 vrtices 和边缘的 id
- php - 适用于 Oracle DB 的 PHP OCI8 不适用于 Windows 上的 IIS (OCI_CRED_EXT)
- html - 如何根据 CSS 转换的百分比计算像素?