Я читал «Кулинарную книгу 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.
из стандарта 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);в начале вашей программы.