First, the good part: separating character (human) representation from binary (low-level) representation is brilliant. No implicit conversion between the two separates the domains very well and creates a much clearer interface.
The bad part: std::byte is really really strict. It only accepts other std::bytes as operands(*). You'd hope this would work
auto f() {
byte b{42};
return b & 0b11;
}
It doesn't. std::byte only accepts other std::byte's as operands. The design goal behind it is good, sure. In practice, I've noticed this means casts are not limited to the interface between low-level and rest-of-the-world: casts and explicit byte's get sprinkled all over the place.
My prediction: most people will dislike the boilerplate std::byte adds and fall back to unsinged char's, until the type restrictions in std::byte are relaxed. I hope I'm wrong though!
(*) Yes, with the exception of shift operations. That was a good design decision!
No comments:
Post a Comment