std :: byte的用例

Som*_*ken 5 c++ c++17

最近添加std::byte到C++ 17让我想知道为什么这种类型甚至被添加到标准中.即使在阅读了cppreference参考文献后,它的用例似乎也不清楚.

我能想出的唯一用例是它更明确地表达了意图,因为它std::byte应该只被视为一个比特集合而不是像char以前用于两个目的的字符类型.意思是:

这个:

std::vector<std::byte> memory;
Run Code Online (Sandbox Code Playgroud)

比这更明确:

std::vector<char> memory;
Run Code Online (Sandbox Code Playgroud)

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

Edg*_*jān 9

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

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

动机和范围

许多程序需要面向字节的内存访问.今天,为此目的,此类程序必须使用char,signed char或unsigned char类型.但是,这些类型执行"三重任务".它们不仅用于字节寻址,还用作算术类型和字符类型.这种多样的角色为程序员错误打开了大门 - 例如意外地对应该被视为字节值的内存执行算术 - 以及程序员和工具的混淆.具有不同的字节类型通过将面向字节的访问与访问存储器区分为字符或整数值来提高类型安全性.它提高了可读性.

拥有该类型还可以使代码的意图更清晰(以及用于理解和转换程序的工具).它通过消除程序员意图表达的模糊性来提高类型安全性,从而提高分析工具的准确性.

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

与char和unsigned char一样,它可以用于访问其他对象占用的原始内存(对象表示),但与这些类型不同,它不是字符类型,也不是算术类型.字节只是一个位集合,只为它定义了按位逻辑运算符.

如上文所述,它确保了额外的类型安全性.

  • IMO事实上`std :: byte`不是算术类型只是寻找问题的解决方案.我无法想象当我处理一系列字节*只是为了使用按位运算*.如果我想要一个不透明字节序列,我使用`void*`(虽然它有指针算法的缺点不能正常工作),如果我想做低级字节操作给我整个操作库.我们已经有了一个非常适合成为"原始字节"的类型:它被称为`unsigned char`.按位和算术运算以有保证和不令人惊讶的方式工作,...... (4认同)
  • ...`unsigned char`指针已经可以成为其他任何指针的别名(不会用额外的魔术类型污染整个标准),指针算术已经可以正常工作。“ unsigned char”的唯一问题是它是一个PITA书写的,是两个标记的名称(因此,函数样式强制转换和co。是有问题的),并且其名称可能不那么具有暗示性。这些问题通过`namespace std {typedef unsigned char byte; }`-顺便说一句,这实际上是在处理原始字节的无数代码库中所做的事情。 (2认同)
  • 现在,如果您想说字符类型不应该使用别名通配符,并且应该有一个单独的字节类型,并且只应该具有别名魔术,这就是我们可以讨论的另一种语言(我同意)仅在“字节”类型的行为类似于无符号整数的情况下),但不幸的是,这不是您可以在C ++中更改的东西,而今天添加一个la脚的“ std :: byte”只会增加混乱。 (2认同)