为什么打印 std::byte 没有重载?

Why is there no overload for printing `std::byte`?

以下代码无法在 C++20 中编译

#include <iostream>
#include <cstddef>

int main(){ 
    std::byte b {65};
    std::cout<<"byte: "<<b<<'\n';// Missing overload
}

C++17加入std::byte时,为什么没有相应的operator<<重载打印呢?我或许可以理解不打印容器的选择,但为什么不std::byte?它试图充当原始类型,我们甚至为 std::string、最近的 std::string_view 可能是最相关的 std::complexstd::bitset本身是可以打印的。

还有 std::hex 和类似的修饰符,所以默认打印 0-255 应该不是问题。

这只是疏忽吗? operator>>呢,std::bitset有,而且一点都不简单

编辑:发现甚至可以打印 std::bitset

来自paper on std::byte (P0298R3):(强调我的)

Design Decisions

std::byte is not an integer and not a character

The key motivation here is to make byte a distinct type – to improve program safety by leveraging the type system. This leads to the design that std::byte is not an integer type, nor a character type. It is a distinct type for accessing the bits that ultimately make up object storage.

因此,不需要隐式 convertible/interpreted 为 char 或任何整数类型,因此不能使用 std::cout 打印,除非显式转换为必填类型。

此外,.

std::byte 用于访问原始数据。允许我用实际上说“这是原始的和未解析的”的东西替换散落在整个代码库中的该死的 uint8_t,而不是可能被误解为 C 字符串的东西。

强调一下:std::byte 并不是“试图成为原始人”,它代表的东西甚至更少——原始数据。

它的实现方式主要是 C++ 和编译器实现的怪癖(“原始”类型的布局规则比结构或 class 简单得多)。

这种事情主要出现在低级代码中,老实说,不应该使用打印。 不可能有时。

例如,我的用例是通过 I2C(或 RS485)接收原始字节并将它们解析为帧,然后将其放入 struct。为什么我要在实际数据上序列化原始字节?我几乎可以立即访问数据?

总而言之,为 std::byte 提供运算符重载以使用 iostream 违背了这种类型的意图。

并且尽可能在代码中表达意图是现代编程的重要原则之一。