С++ Какова роль std:: ctype <char>:: widen()?

В соответствии со стандартом С++ (§30.7.5.2.4 проекта С++ 17 draft (N4659)) out << ch не будет выполнять расширяющуюся операцию на ch, если ch является char и out - это std::ostream.

Означает ли это, что std::ctype<char>::widen() (т.е. charchar) гарантируется стандартом как тождественная функция (widen(ch) == ch) для всех символов в наборе основных исходных символов?

Если это так, означает ли это, в свою очередь, что все локали требуются стандартом для использования одного и того же неширокого (или многобайтового) кодирования символов из базового набора символов источника?

Если нет, кажется, что out << 'x', с определенным выбором кодировки символов для литералов, может не работать во всех локалях, даже если он работает в некоторых. То есть, не может быть выбора символьного кодирования букв, так что out << 'x' работает во всех локалях одновременно.

Ответ 1

Нет, он просто говорит, что в случае

template<class traits>
basic_ostream<char, traits>& operator<<(basic_ostream<char, traits>& out, char c);

где и поток, и оператор << обмениваются одним и тем же типом char, нет преобразования.

Если c имеет тип char, а характер символа потока не char, то seq состоит из out.widen(c); иначе seq состоит из c.

Во всех остальных случаях локаль используется для необязательного преобразования символа без ограничений на то, что могут делать локали.