Я вижу, что разрешено писать char
к std::wostream
(например, std::wcout<<"looooool";
).
Как char
изменился на wchar
(если это то, что происходит)?
Когда вы отправляете char
или c-строка (char *
) к широкому потоку «отдельные октеты (байты) преобразуются в wchar с widen
. Там нет автоматического преобразования из std::string
,
Вы не можете отправлять многобайтовые символы UTF-8 в широкий поток, так как байты конвертируются по одному за раз. В локали по умолчанию нет преобразования не-ascii символа в широкий символ, поэтому преобразование завершится неудачно, и широкий поток перейдет в состояние ошибки.
Пользуетесь ли вы этим обращением или нет, зависит от вас; стандарт допускает это, и для символьных и строковых литералов, по крайней мере, он кажется мне безвредным. Но имейте в виду, что строковые объекты, которые вы отправляете в широкий поток, должны быть std::wstring
не std::string
,
Других решений пока нет …