Смешивание cout и wcout в одной программе

Я читал «Кулинарную книгу C ++», в которой был следующий фрагмент:

// cout  << s  << std::endl;  // You shouldn't be able to
wcout << ws << std::endl;     // run these at the same time

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

Кроме того, я нашел этоТАК вопрос кажется, что смешивать wcout и cout можно. Может ли кто-нибудь объяснить мне, о чем говорит этот комментарий?

РЕДАКТИРОВАТЬ

Из стандарта C ++ [27.4.1]:

Операции микширования с соответствующими широкими и узкими символьными потоками следуют той же семантике, что и микширование таких операций с файлами, как указано в поправке 1 стандарта ISO C.

Из стандарта С [7.19.2]:

Каждый поток имеет ориентацию. После того, как поток связан с внешним файлом, но перед выполнением каких-либо операций с ним, поток не имеет ориентации. Как только функция ввода / вывода широких символов была применена к потоку без ориентации, поток становится широко ориентированным потоком. Точно так же, как только байтовая функция ввода / вывода была применена к потоку без ориентации, поток становится потоком с байтовой ориентацией. В противном случае только вызов функции freopen или функции fwide может изменить ориентацию потока. (Успешный вызов freopen удаляет любую ориентацию.)

Байтовые функции ввода / вывода не должны применяться к широко ориентированному потоку, а широкие символьные функции ввода / вывода не должны применяться к байтово ориентированному потоку.

Таким образом, стандарт, кажется, говорит, что вы не должны смешивать их. Тем не менее, я нашел эту цитатуиз этой статьи:

Для Visual C ++ 10.0 функция fwide задокументирована как невыполненная. И с практической точки зрения, по крайней мере на уровне вывода целых строк, он, очевидно, прекрасно работает, чтобы смешать использование cout и wcout. Так что, к счастью, Visual C ++ явно игнорирует требования стандарта и не поддерживает непрактичную явную ориентацию потока C FILE.

А также, что касается GCC, я нашел эту цитату изВот:

Это (новая) функция, а не ошибка, см. Libstdc ++ / 11705 и общий поиск ориентации потока в стандарте C (C99, 7.19.2). Короче говоря, вы не можете смешивать байтово-ориентированный и широко-ориентированный ввод-вывод. На данный момент, из-заошибка Как указано в libstdc ++ / 11705, вы можете получить что-то близкое к вашим ожиданиям, вызвав std :: ios :: sync_with_stdio (false); в начале вашей программы.

Ответы на вопрос(5)

Ваш ответ на вопрос