std :: byte是否定义良好?

Sto*_*ica 24 c++ c++17

C++ 17引入了这种std::byte类型.一种库类型,可以(据称)用于访问原始内存,但与字符类型分开,仅代表一块位.

到现在为止还挺好.但这个定义让我有点担心.如[cstddef.syn]中所述:

enum class byte : unsigned char {};
Run Code Online (Sandbox Code Playgroud)

我在SO上看到了两个答案,这些答案似乎暗示了上述内容的稳健性.这个答案认为(没有参考)具有基础类型的枚举具有与所述类型相同的大小和对齐要求.直观地说,这似乎是正确的,因为指定底层类型允许不透明的枚举声明.

但是,这个答案认为标准只保证两个具有相同底层类型的枚举是布局兼容的,而不是更多.

在阅读[dcl.enum]时,我忍不住注意到,实际上,底层类型仅用于指定枚举器的范围.没有提到尺寸或对齐要求.

我错过了什么?

Mik*_*eMB 8

本质上有特殊的措辞各地,让C++的17个标准草案,std::byte关于混叠相同的属性charunsigned char.

举个例子,在n4659中以$ 6.10表示

8如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义.
[...]
(8.8) - char,unsigned char或std :: byte类型.

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

编辑
也许我错误地理解了你的问题:如果你问,如果标准保证sizeof(std::byte) == alignof(std::byte) == 1那时我认为情况并非如此,因为似乎没有关于这些属性如何依赖于范围枚举的基础类型的措辞而且我不能std::byte在这方面找不到特别的措辞.正如@TC在评论中提到的那样,这可能是语言中的缺陷.


Sto*_*ica 5

(记录@TC所做的最终回答我的问题的评论)
(如果 TC 希望重新表述他自己的答案,我将删除它。)


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


考虑到 CWG 批准了这种表述std::byte并可能认为存在大小/对齐关系,因此关于枚举及其基础类型的更普遍的问题可能值得成为一个核心问题。实际上,明确的意图是std::byte占用一个字节;没有理智的实施者会以不同的方式做这件事。


Dav*_*ing 3

CWG2590修正了这一疏忽;it\xe2\x80\x99s 首次在 C++23 中发布,但当然意味着适用于所有版本,因为 \xe2\x80\x9ce 每个人都知道\xe2\x80\x9denum这样工作的。

\n