С++ Какова роль std:: ctype <char>:: widen()?
В соответствии со стандартом С++ (§30.7.5.2.4 проекта С++ 17 draft (N4659)) out << ch
не будет выполнять расширяющуюся операцию на ch
, если ch
является char
и out
- это std::ostream
.
Означает ли это, что std::ctype<char>::widen()
(т.е. char
→ char
) гарантируется стандартом как тождественная функция (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
.
Во всех остальных случаях локаль используется для необязательного преобразования символа без ограничений на то, что могут делать локали.