GCC 4.8 и потоки char16_t - ошибка?

Это ошибка libstdC++?

#include <string>
#include <sstream>

using namespace std;

int main() {
        basic_string<char16_t> str(u"0.0");
        basic_stringstream<char16_t> sstr(str);
        double x = 9;
        sstr >> x;
}

Вывод, под GCC 4.8 Linux x86_64:

$ ./main
terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast
Aborted (core dumped)

Редактировать Может кто-нибудь предложить способ заставить эту функцию работать в GCC 4.9 без изменения ее подписи:

template<typename T>
T fromString(std::basic_stringstream<char16_t>& stream)
{
    T v;
    stream >> v;
    return v;
}

Типичное использование:

std::basic_string<char16_t> string(...);
std::basic_stringstream<char16_t> sstream(string);
double v = fromString<double>(sstream);

1 ответ

Решение

Стандарт не требует реализации для поддержки потоков любого типа, кроме char а также wchar_t,

[iostreams.limits.pos]

В классах по п.27 параметр шаблона с именем charT представляет собой член набора типов, содержащих char, wchar_tи любые другие определяемые реализацией типы символов, которые удовлетворяют требованиям для символа, для которого может быть создан экземпляр любого из компонентов iostream.

Кроме того, для работы не требуются фасеты, используемые для извлечения целых чисел и чисел из потоков. char16_t или:

[Category.numeric]

Все спецификации функций-членов для num_put а также num_get в подпунктах 22.4.2 применяются только к специализациям, требуемым в таблицах 81 и 82 (22.3.1.1.1), а именно num_get<char>, num_get<wchar_t>, num_get<C, InputIterator>, num_put<char>, num_put<wchar_t>, а также num_put<C,OutputIterator>,

где C:

Параметр шаблона с именем C представляет собой набор типов, содержащий char, wchar_tи любые другие определяемые реализацией типы символов, которые удовлетворяют требованиям для символа, для которого может быть создан экземпляр любого из компонентов iostream.

Стандарт требует только, чтобы char_traits (так что basic_string) а также codecvt работать правильно для char16_t а также char32_t,

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

Другие вопросы по тегам