C ++ 17引入了std::byte
类型。一种库类型,可以(据称)用于访问原始内存,但与字符类型分开,仅代表一块位。
到目前为止一切顺利。但这个定义让我有点担心。正如[cstddef.syn]中所述:
enum class byte : unsigned char {};
我在SO上看到了两个答案,这些答案似乎暗示了上述内容的稳健性。 This answer认为(没有引用)具有基础类型的枚举具有与所述类型相同的大小和对齐要求。直观地说,这似乎是正确的,因为指定基础类型允许不透明的枚举声明。
然而,this answer认为标准只保证两个具有相同基础类型的枚举是布局兼容的,而不再是。
在阅读[dcl.enum]时,我忍不住注意到,实际上,基础类型仅用于指定枚举器的范围。没有提及尺寸或对齐要求。
我错过了什么?
答案 0 :(得分:8)
基本上,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
的特殊措辞。作为@ T.C。在评论中提到,这可能是该语言的缺陷。
答案 1 :(得分:4)