c++c++20stdoutiostreamstd-byte

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


The following code does not compile in C++20

#include <iostream>
#include <cstddef>

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

When std::byte was added in C++17, why was there no corresponding operator<< overloading for printing it? I can maybe understand the choice of not printing containers, but why not std::byte? It tries to act as primitive type and we even have overloads for std::string, the recent std::string_view, and perhaps the most related std::complex, and std::bitset itself can be printed.

There are also std::hex and similar modifiers, so printing 0-255 by default should not be an issue.

Was this just oversight? What about operator>>, std::bitset has it and it is not trivial at all.

EDIT: Found out even std::bitset can be printed.


Solution

  • From the paper on std::byte (P0298R3): (emphasis mine)

    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.

    (emphasis mine)

    As such, it is not required to be implicitly convertible/interpreted to be either a char or any integral type whatsoever and hence cannot be printed using std::cout unless explicitly cast to the required type.

    Furthermore, see How to use new std::byte type in places where old-style unsigned char is needed?.