Those aren't consistent; the last one specifies char instead of charT.Corentin Jabot wrote:Very rough draft https://isocpp.org/files/papers/D3258R0.pdfLooks good. I'm however not sure that it makes sense to format char8_t (char16_t is borderline.) Or maybe that's only intended for {:?} ?What about iostream? This is a story for another paper (One that an enthusiastic reader is encouraged to write!)Here's that paper: Insert at the end of https://eel.is/c++draft/ostream.inserters.character the following: template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, const char8_t* s); template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& out, const char16_t* s); template<class traits> basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, const char32_t* s);
Preconditions: s is not a null pointer. Effects: Behaves like a formatted inserter (as described in [ostream.formatted.reqmts]) of `out`. Creates a character sequence `seq` holding the transcoded representation of s [format.string.transcode]. Determines padding for `seq` as described in [ostream.formatted.reqmts]. Inserts `seq` into `out`. Calls `width(0)`. Returns: `out`.
It would be odd to supply inserters without corresponding extractors.
Characters should be handled as well as strings:
template<class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& out,
char8_t);
template<class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& out,
char16_t);
template<class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& out,
char32_t);
Variations of the above for both characters and strings are
already defined as deleted in [ostream.general].
Tom.