Почему `wstring_convert` выбрасывает range_error?

У меня есть C ++ код, который конвертирует string который содержит ��(АЛХИМИЧЕСКИЙ СИМВОЛ ДЛЯ АКВА РЕГИА) чтобы u16string:

#include <string>
#include <codecvt>
#include <locale>
using namespace std;

int main() {
setlocale(LC_ALL, "ru_RU.UTF-8");
string s = "��";

wstring_convert<codecvt_utf8<char16_t>, char16_t> converter;
u16string s16 = converter.from_bytes(s);
return 0;
}

Обратите внимание, что я не использование wstring или любой istream,

Это дает мне std::range_error:

terminate called after throwing an instance of 'std::range_error'
what():  wstring_convert::from_bytes

Но на ideone этот код работает без ошибок.

Я получаю сообщение об ошибке с g ++ 7.2.0 и clang 4.0.1 при компиляции с -std=c++14,

Почему нет ошибки на ideone и почему я получаю эту ошибку?


У меня есть арка Linux 4.12.13 и locale Команда дает мне:

LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"...
LC_IDENTIFICATION="ru_RU.UTF-8"LC_ALL=

0

Решение

Разве это не то, каким должен быть ваш конвертер?

std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;

4

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

Других решений пока нет …