【发布时间】:2017-07-17 05:46:08
【问题描述】:
C++17 引入了std::byte 类型。一种可以(据说)用于访问原始内存的库类型,但与字符类型分开,仅代表一个位块。
到目前为止一切顺利。但是这个定义让我有点担心。如[cstddef.syn]:
enum class byte : unsigned char {};
我在 SO 上看到了两个答案,这似乎暗示了关于上述稳健性的不同事情。 This answer 认为(没有参考)具有基础类型的枚举具有与所述类型相同的大小和对齐要求。直觉上这似乎是正确的,因为指定底层类型允许不透明的枚举声明。
然而,this answer 认为该标准仅保证具有相同底层类型的两个枚举是布局兼容的,仅此而已。
在阅读[dcl.enum] 时,我不禁注意到,确实,底层类型仅用于指定枚举数的范围。没有提及尺寸或对齐要求。
我错过了什么?
【问题讨论】:
-
无论如何,我想你所有的疑虑都被这样一个事实消除了,你可以使用
std::byte{x}从数字中创建一个字节,并使用std::to_integer进行相反的转换。好吧,可能仍然存在疑问,但至少你有 tools 可以在需要时轻松处理字节。获取整数,直接使用它,完成后将其转换回字节。确实不错。 ;-) -
最有趣的部分是 a first draft 中提出了这个词更改 - 类型字节是实现定义的不同类型,具有与 unsigned char 相同的大小、符号和对齐方式,称为底层类型。这将包含您问题的答案,但it is has been removed 因此。该死的!!无论如何,这让我觉得它是多余的,标准可能在某处包含这些信息。
-
以下是不是不清楚? 6.9 类型 2/“对于普通可复制类型 T 的任何对象(基类子对象除外),无论该对象是否拥有类型 T 的有效值,构成该对象的基础字节(4.4)都可以复制到char、unsigned char 或 std::byte (21.2.1) 的数组。43 如果将该数组的内容复制回对象,则该对象随后应保持其原始值。
-
考虑到 CWG 批准了
std::byte的这种表述并且可能认为存在大小/对齐关系,关于枚举及其基础类型的更一般的问题可能值得一个核心问题。实际上,明确的意图是让std::byte占用一个字节;没有一个理智的实施者会这样做。