Canot从basic_stringstream <char8_t>读取char8_t

时间:2019-08-08 06:31:43

标签: c++ gcc c++20 gcc9

我只是在UTF-8中尝试stringstream

#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时似乎出现了问题,但我不知道如何纠正它。请帮帮我!

1 个答案:

答案 0 :(得分:5)

这实际上是一个旧问题,并不专门支持char8_t。在C ++ 11和更高版本中,char16_tchar32_t会发生相同的问题。以下gcc错误报告具有类似的测试用例。

下面还将讨论该问题:

问题在于,gcc不会使ctype<char8_t>ctype<char16_t>ctype<char32_t>的构面隐式地赋于全局语言环境。尝试执行需要这些方面之一的操作时,会从std::bad_cast抛出std::__check_facet异常(随后被为字符提取运算符创建的IOS哨兵对象静默吞噬,然后设置{ {1}}和badbit)。

C ++标准仅要求提供failbitctype<char>。参见[locale.category]p2