【问题标题】:Is std::byte well defined?std::byte 定义明确吗?
【发布时间】: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 如果将该数组的内容复制回对象,则该对象随后应保持其原始值。
  • 奇怪的是,N2213 有保证与底层类型相同的表示的措辞,但在N2347 中删除了该措辞。事实上,它甚至删除了提供相同 sizeof 的 C++03 措辞,没有任何明显的替换。
  • 考虑到 CWG 批准了 std::byte 的这种表述并且可能认为存在大小/对齐关系,关于枚举及其基础类型的更一般的问题可能值得一个核心问题。实际上,明确的意图是让std::byte 占用一个字节;没有一个理智的实施者会这样做。

标签: c++ c++17


【解决方案1】:

本质上,围绕 c++17 草案标准有一些特殊的措辞,它为 std::byte 提供了与 charunsigned char 相同的别名属性。

举个例子,在 n4659 的 $6.10 中声明

8 如果程序尝试通过非下列类型之一的左值访问对象的存储值,则行为未定义。
[...]
(8.8) — char、unsigned char 或 std::byte 类型。

我没有进行详尽的搜索,但基本上任何 char 在标准中得到特殊处理的地方,std::byte 也是如此。就访问内存而言,将其定义为枚举或它的底层类型是什么似乎无关紧要。

编辑
也许我错误地理解了你的问题:如果你问的是,如果标准保证sizeof(std::byte) == alignof(std::byte) == 1 那么我相信情况并非如此,因为似乎没有关于这些属性如何依赖于作用域枚举的基础类型的措辞和在这方面,我找不到std::byte 的特殊措辞。作为@T.C.在 cmets 中提到,这可能是语言的缺陷。

【讨论】:

  • 嗯,我在我的问题的几个地方链接到草稿。如果你能帮我指出这个部分,我会接受。我确实看过,但没有成功。
  • @StoryTellee。我添加了来自 n4659 的(格式错误的)报价。主要问题是我目前正在使用手机。
  • 啊,很好。现在在在线版本中找到它。现在我只需要考虑相同的大小和对齐是否不再重要。
  • @StoryZeller:如果您想知道是否可以用同样的方式定义自己的字节类型,答案是 afaik no。
  • 我不是。我想知道别名是否会根据核心语言本身给我正确的结果。
【解决方案2】:

(记录 @T.C. 制作的 cmets 最终回答了我的问题)
(如果 T.C. 想重新制定他自己的答案,我会删除它。)


奇怪的是,N2213 的措辞保证相同 表示为基础类型,但该措辞在 N2347。事实上,它甚至删除了提供的 C++03 措辞 相同的 sizeof 没有任何明显的替换。


关于枚举及其基础类型的更一般的问题 考虑到 CWG 批准了这个问题,这可能是一个核心问题 std::byte 的公式化并且大概认为 存在大小/对齐关系。作为一个实际问题,明确 意图是让std::byte 占用一个字节;没有理智 实施者会采取不同的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2022-01-24
    • 2011-06-10
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多