Codecvt не работает в GCC

Я пытаюсь использовать свой собственный codecvt со стандартными iostreams. Я использую эту строку:

std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));

rot13codecvt это просто пример, бесстыдно поднятый дословно от Interwebs. Полный работоспособный пример Вот. Мой настоящий codecvt делает что-то другое.

Как вы можете видеть в связанном живом примере, это не довольно работать в g ++. Выходной сигнал не рот13д. Никакая функция из пользовательского класса codecvt никогда не вызывается. Но это хорошо работает в VS2012.

Я пробовал другие локали, кроме «C», и ни одна из них не работает. Также попробовал пример Вот, тот же результат.

Что я делаю неправильно?

2

Решение

Для использования требуются только файловые потоки std::codecvt<...> и не требуется, чтобы какой-либо из стандартных объектов потока был реализован в терминах файловых потоков. Есть причины для исполнителей любого выбора. Реализация Dinkumware использует <stdio.h> для большинства его операций и имеет смысл использовать ту же реализацию под капотом в этом случае. libstdc ++ избегает некоторых издержек и напрямую обращается к буферу, совместно используемому между стандартными потоками C и C ++, и, таким образом, использует другую реализацию потока.

При использовании файловых потоков использование std::codecvt<...> грани должны быть последовательными.

2

Другие решения

Библиотека libstdc ++, поставляемая с g ++, пока не реализует стандарт c ++ 11. На моей версии <codecvt> заголовок отсутствует вообще.

f.jardon@xxxx 14:40:40 ~
$ find /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/ -name codecvt

f.jardon@xxxx 14:41:17 ~

И это не единственное, чего не хватает:

f.jardon@xxxx 14:46:22 ~
$ grep -rl wbuffer_convert 'c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/'
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/wbuffer
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/xtest
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/xlocbuf

f.jardon@xxxx 14:46:25 ~
$ grep -rl wbuffer_convert /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/
0

Заголовок codecvt существует с gcc 5.1.

0