std::byte的目的是什么?

35
现在c++17有了std::byte,我正在寻找一种将读取文件的代码转换为读取字节的代码的方法。一个文件包含字节,而不是一堆整数。
然后我阅读了这个问题和这个问题,人们争论说将文件读入字节是错误的,而将文件读入字符是正确的。
如果byte不是为访问内存或类似文件而设计的,那么它的目的是什么呢?正如在另外两个问题中引用的那样:
像char和unsigned char一样,它可以用来访问其他对象占用的原始内存(对象表示),但与这些类型不同,它既不是字符类型也不是算术类型。字节只是一组位,只有按位逻辑运算符才能对其进行定义。
这听起来就像应该用于读取文件而不是字符的确切类型。

2
如果您打算操作对象的字节,使用unsigned char*std::byte*哪个更具表现力?请将其视为词汇类型。 - StoryTeller - Unslander Monica
4
说实话,我也没有看到它的目的。对其允许的操作似乎是随意的。位操作和加法有什么区别?为什么一个被允许,而另一个被禁止?但我同意StoryTeller的观点,当你只想存储/读取/写入一些字节时,std::byte 是一个更富表现力的名称。除非有人能给我们一个启发性的答案,否则我认为我永远不会使用它,因为unsigned char对我来说已经足够了。 - geza
2
@geza:理论上讲,像加法这样的运算会为每个比特位赋予意义,而比特操作并不会。如果你的字节表示一个数字(否则你为什么要使用加法),请使用整数类型。 实际上,这会破坏一些位运算技巧,例如 i & (i-1),它们只想执行位操作。 - MikeMB
2
@MikeMB:好的例子!这也是我不会使用std::byte的另一个原因。(虽然可以争论应该有一个clearLowestBit(std::byte)函数来进行内部转换,但我真的看不出禁止在字节上进行常规操作(如加法)的好处) - geza
4
有很多位运算技巧需要使用数值运算,无法使用std函数覆盖它们所有。 - geza
显示剩余3条评论
1个回答

23

你可能有误解。

byte 非常适用于“访问内存”。当存储器只是一系列字节而不是字符数组时,你应该使用这种类型。

Iostream 类型不能专门使用 byte,因为它们的设计是围绕字符作为它们的接口。也就是说,它们不认为文件是字节序列;它们认为文件是字符序列。 当然,你可以通过使用一两个强制转换直接读入一个 byte 数组。但这不是iostream本地思考的方式。

你必须区分iostream的工作方式和文件的工作方式。毕竟iostream只是一个文件IO库,它远非文件API的全部。

大多数读取二进制数据的文件API会采用 void* 而不是字符数组。像是 std::fread/fwrite等等。

也就是说,你应该把这看作不是关于std::byte的问题,而是关于iostream的问题。这只是其中一件小事。


10
输入输出流又来捣乱了,停止使用它即可。 - Lectem
2
据我所知,iostream(std::fstream)是处理Unicode文件名的唯一跨平台方式 - 使用std::filesystem::path重载。是否有计划向std::fopen添加类似的重载或提供不同的方法来读取文件中的二进制数据? - Nikolai
1
@Nikolai:委员会不愿意对C标准库的API进行修改。但是ifstream API非常适用于读取二进制数据。 - Nicol Bolas
3
@Nicol Bolas:这条评论表明iostreams不适合用于对文件进行原始访问,这是不正确的吗?也许您可以澄清一下字节和字符之间的确切区别是什么? - Nikolai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接