std :: byte是否定义良好?

时间:2017-07-17 05:46:09

标签: c++ c++17

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

到目前为止一切顺利。但这个定义让我有点担心。正如[cstddef.syn]中所述:

enum class byte : unsigned char {};

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

然而,this answer认为标准只保证两个具有相同基础类型的枚举是布局兼容的,而不再是。

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

我错过了什么?

2 个答案:

答案 0 :(得分:8)

基本上,c ++ 17草案标准中都有一些特殊的措辞,它为std::bytechar提供了与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)

<子> (记录@T.C.最终回答我的问题的评论)
(如果T.C.希望重新制定他自己的答案,我会删除它。)

  

奇怪的是,N2213的措辞保证相同   表示基础类型,但该措辞被删除   N2347。实际上,它甚至删除了C ++ 03提供的措辞   没有任何明显替代品的相同尺寸。


  

关于枚举及其基本类型的更一般的问题   鉴于CWG批准了此问题,这可能是一个核心问题   std::byte的制定,大概是认为的   存在大小/对齐关系。作为一个实际问题,明确   意图是std::byte占用,一个字节;没有理智   实施者会采用不同的方式。