What actually belongs to the "character type" in C11 — besides char of course?
To be more precise, the special exceptions for the character type (for example that any object can be accessed by an lvalue expression of character type — see §6.5/7 in C11 standard), to which concrete types do they apply? They seem to apply to uint8_t and int8_t from stdint.h, but is this guaranteed? On the other hand gcc doesn't regard char16_t from uchar.h as a "character type".
signed charandunsigned char.int8_tanduint8_tare just aliases for existing types.int8_tanduint8_ton extended integer types, functionally identical tosigned charandunsigned charrespectively except that they would not count as "character types" for §6.5/7. As far as I know, no implementation has carried through this idea, but I'm not aware of any reason it's forbidden, either. (The advantage of this would be, for instance, that you could now have string pointers that didn't alias all the other pointers in the program.)std::basic_string<uint8_t>, etc.?char*and/orstd::string, but it could be done. I suspect careful use ofrestrictgets you at least 90% of the benefit, though.