Невозможно прочитать char8_t из basic_stringstream‹char8_t›

Я просто пытаюсь stringstream в UTF-8:

#include<iostream>
#include<string>
#include<sstream>
int main()
{
    std::basic_stringstream<char8_t> ss(u8"hello");
    char8_t c;
    std::cout << (ss.rdstate() & std::ios_base::goodbit) << " " << (ss.rdstate() & std::ios_base::badbit) << " "
            << (ss.rdstate() & std::ios_base::failbit) << " " << (ss.rdstate() & std::ios_base::eofbit) << "\n";
    ss >> c;
    std::cout << (ss.rdstate() & std::ios_base::goodbit) << " " << (ss.rdstate() & std::ios_base::badbit) << " "
            << (ss.rdstate() & std::ios_base::failbit) << " " << (ss.rdstate() & std::ios_base::eofbit) << "\n";
    std::cout << c;
    return 0;
}

Скомпилируйте, используя:

g++-9 -std=c++2a -g -o bin/test test/test.cpp

Результат на экране:

0 0 0 0
0 1 4 0
0

Кажется, что-то идет не так при чтении c, но я не знаю, как это исправить. Помогите мне, пожалуйста!


person 陈浩南    schedule 08.08.2019    source источник


Ответы (1)


На самом деле это старая проблема, не связанная с поддержкой char8_t. Та же проблема возникает с char16_t или char32_t в C++ 11 и новее. В следующем отчете об ошибке gcc есть аналогичный тестовый пример.

Этот вопрос также обсуждается на следующих форумах:

Проблема в том, что gcc неявно не наполняет глобальную локаль аспектами для ctype<char8_t>, ctype<char16_t> или ctype<char32_t>. При попытке выполнить операцию, требующую одного из этих фасетов, из std::__check_facet выбрасывается исключение std::bad_cast (которое впоследствии молча поглощается часовым объектом IOS, созданным для оператора извлечения символов, и который затем устанавливает badbit и failbit).

Стандарт C++ требует только предоставления ctype<char> и ctype<wchar_t>. См. [locale.category]p2.

person Tom Honermann    schedule 12.08.2019