为什么打印 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::complex
、和std::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
违背了这种类型的意图。
并且尽可能在代码中表达意图是现代编程的重要原则之一。
以下代码无法在 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::complex
、和std::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 characterThe 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
违背了这种类型的意图。
并且尽可能在代码中表达意图是现代编程的重要原则之一。