C++ 17引入了这种std::byte类型.一种库类型,可以(据称)用于访问原始内存,但与字符类型分开,仅代表一块位.
到现在为止还挺好.但这个定义让我有点担心.如[cstddef.syn]中所述:
enum class byte : unsigned char {};
Run Code Online (Sandbox Code Playgroud)
我在SO上看到了两个答案,这些答案似乎暗示了上述内容的稳健性.这个答案认为(没有参考)具有基础类型的枚举具有与所述类型相同的大小和对齐要求.直观地说,这似乎是正确的,因为指定底层类型允许不透明的枚举声明.
但是,这个答案认为标准只保证两个具有相同底层类型的枚举是布局兼容的,而不是更多.
在阅读[dcl.enum]时,我忍不住注意到,实际上,底层类型仅用于指定枚举器的范围.没有提到尺寸或对齐要求.
我错过了什么?
本质上有特殊的措辞各地,让C++的17个标准草案,std::byte关于混叠相同的属性char和unsigned 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在评论中提到的那样,这可能是语言中的缺陷.