std :: byte的用例

时间:2018-01-20 10:54:45

标签: c++ c++17

最近将std::byte添加到C ++ 17让我想知道为什么这种类型甚至被添加到标准中。即使在阅读the cppreference reference之后,我的用例似乎也不清楚。

我能想出的唯一用例是它更清楚地表达了意图,因为std::byte应该只被视为一个位集合而不是我们使用的char这样的字符类型以前用于这两个目的。 意思是:

这样:

std::vector<std::byte> memory;

比这更清楚:

std::vector<char> memory;

这是唯一的用例以及它被添加到标准中的原因还是我错过了一个重点?

1 个答案:

答案 0 :(得分:9)

  

我能想出的唯一用例是它更明确地表达了意图

我认为这是其中一个原因。 This paper解释了std::byte背后的动机,并将其用法与 char 的用法进行了比较:

  

动机和范围

     

许多程序需要面向字节的访问   记忆。今天,这样的程序必须使用char,signed char或者   为此目的的unsigned char类型。但是,这些类型执行a   “三重责任”。它们不仅用于字节寻址,还用作字节寻址   算术类型和字符类型。这种多样的角色   为程序员错误打开了大门 - 比如意外执行   应该被视为字节值的内存算术 - 和   程序员和工具的混乱。 具有不同的字节类型   通过区分面向字节的内存访问来提高类型安全性   从访问内存作为字符或整数值。它改善了   可读性。

     

拥有该类型也会产生代码的意图   更清楚的读者(以及理解和工具的工具)   改造计划)。它通过删除增加了类型安全性   程序员意图表达的含糊不清,从而增加   分析工具的准确性。

另一个原因是std::byte在可以对此类型执行的操作方面受到限制:

  

与char和unsigned char类似,它可用于访问原始内存   由其他对象(对象表示)占用,但与那些不同   类型,它不是字符类型,不是算术类型。一个   byte只是一个位集合,而只是位逻辑运算符   是为它定义的

确保了上文提到的附加类型安全性。