【发布时间】:2017-11-24 23:34:18
【问题描述】:
既然 c++17 有 std::byte,我正在寻找一种方法,将读取文件的代码转换为 char 的代码,将文件读取到 byte 的代码。文件包含字节,而不是一堆整数。
然后我读到this question 和this other question,人们认为将文件读入byte 是错误的,而将文件读入char 是正确的。
如果byte不是为访问内存而设计的,以此类推,文件的目的是什么?正如在其他两个问题中所引用的那样:
与 char 和 unsigned char 一样,它可用于访问原始内存 被其他对象占据(对象表示),但不同于那些 类型,它不是字符类型,也不是算术类型。一种 byte 只是位的集合,并且只有位逻辑运算符 是为它定义的。
这听起来像是应该用于读取文件的确切类型,而不是字符。
【问题讨论】:
-
将其视为词汇类型。如果您打算操作对象的 bytes,后者更具表现力,
unsigned char*或std::byte*? -
说实话,我也没有真正看到它的目的。允许的操作似乎是任意的。位操作(例如加法)之间有什么区别?为什么一个是允许的,一个是禁止的?但我同意 StoryTeller 的观点,
std::byte在您只想存储/读取/写入一些字节时是一个更具表现力的名称。我认为我永远不会使用它(除非有人能给我们一个启发性的答案),因为unsigned char对我来说很好 -
@geza:好吧,理论上,加法之类的事情会为各个位分配含义,而位操作则不会。如果您的字节代表一个数字(为什么还要使用加法),请使用整数类型。在实践中,这打破了像
i & (i-1)这样的一些比特小技巧,它们也只想执行位操作。 -
@MikeMB:很好的例子!这是我不使用
std::byte的另一个原因。 (有人可能会争辩说,应该有一个clearLowestBit(std::byte)函数,它在内部进行强制转换 - 但我并没有真正看到禁止对字节进行常规操作的好处,比如加法) -
@MikeMB: ... 有很多位技巧,需要进行数值运算。你不能用
std函数覆盖它们。