Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::字节定义是否正确?_C++_C++17 - Fatal编程技术网

C++ std::字节定义是否正确?

C++ std::字节定义是否正确?,c++,c++17,C++,C++17,C++17引入了std::byte类型。一种库类型,可以(假定)用于访问原始内存,但与字符类型不同,只表示一个位块 到目前为止还不错。但这个定义让我有点担心。如下所示: 我在上面看到了两个答案,这两个答案似乎暗示了关于上述稳健性的不同东西。论证(无引用)具有基础类型的枚举具有与所述类型相同的大小和对齐要求。直观地看,这似乎是正确的,因为指定基础类型允许不透明的枚举声明 然而,该标准只保证具有相同基础类型的两个枚举是布局兼容的,而不是更多 阅读时,我忍不住注意到,实际上,底层类型仅用于指定枚举数的

C++17引入了
std::byte
类型。一种库类型,可以(假定)用于访问原始内存,但与字符类型不同,只表示一个位块

到目前为止还不错。但这个定义让我有点担心。如下所示:

我在上面看到了两个答案,这两个答案似乎暗示了关于上述稳健性的不同东西。论证(无引用)具有基础类型的枚举具有与所述类型相同的大小和对齐要求。直观地看,这似乎是正确的,因为指定基础类型允许不透明的枚举声明

然而,该标准只保证具有相同基础类型的两个枚举是布局兼容的,而不是更多

阅读时,我忍不住注意到,实际上,底层类型仅用于指定枚举数的范围。没有提及尺寸或对齐要求


我遗漏了什么?

基本上,在c++17标准草案中有专门的措词,在别名方面,赋予
std::byte
char
unsigned char
相同的属性

举个例子,n4659中的$6.10表示

8如果程序试图通过以下类型以外的glvalue访问对象的存储值,则行为未定义。
[…]
(8.8)-字符、无符号字符或std::字节类型。

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

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

(记录最终回答我问题的人的评论)
(如果T.C.希望重新制定自己的答案,我将删除此选项。)


奇怪的是,他们的措辞保证完全相同 表示为基础类型,但该措辞已在中删除 . 事实上,它甚至删除了C++03中规定 尺寸相同,无任何明显更换



关于枚举及其底层类型的更一般的问题 鉴于CWG批准了这一点,这可能是一个值得关注的核心问题
std::byte
的公式,可能认为 存在大小/对齐关系。作为一个实际问题,这个问题是明确的 目的是让
std::byte
占用一个字节;没有理智 实现者将以不同的方式来做


无论如何,我想你所有的疑问都被消除了,因为你可以使用
std::byte{x}
从一个数字中创建一个字节,并使用
std::to_integer
进行相反的转换。嗯,怀疑可能仍然存在,但至少您有工具可以在需要时轻松处理字节。获取整数,直接使用它,完成后将其转换回字节。确实不错最有趣的是,在这个词中提出了改变——类型byte是一个实现定义的不同类型,具有与无符号字符相同的大小、有符号性和对齐方式,称为底层类型。这本可以包含你问题的答案,但结果是。该死的!!无论如何,它让我觉得它是多余的,标准可能在某个地方包含了这些信息。奇怪的是,它的措辞保证了与底层类型相同的表示形式,但该措辞在中被删除了。事实上,它甚至删除了C++03中提供相同的
sizeof
的措辞,而没有任何明显的替换。关于枚举及其底层类型的更一般的问题可能值得关注,鉴于CWG批准了这一
std::byte
的表述,并且可能认为存在大小/对齐关系。实际上,明确的意图是
std::byte
占用一个字节;没有一个理智的实施者会有不同的做法。@T.C.-谢谢。很高兴知道我没有遗漏什么。我还认为你的综合评论实际上是对我问题的回答。你能把它们贴出来吗?嗯,在我的问题中,我在好几个地方链接到了草稿。如果你能为我指出这一部分,我会接受的。“我确实看了,但没有成功。”斯托里特利说。我添加了n4659中的一个(格式错误)引用。主要问题是我现在在手机上。啊,很好。现在在在线版本中找到了它。现在我只需要考虑一下相同的大小和对齐是否仍然重要。@StoryZeller:如果你想知道是否可以用相同的方式定义自己的字节类型,答案是A:不,我不是。我想知道,基于核心语言本身,别名是否会给我正确的结果。
enum class byte : unsigned char {};