Canot从basic_stringstream <char8_t>读取char8_t

陈浩南*_*陈浩南 7 c++ gcc c++20 gcc9

我只是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;
}

Run Code Online (Sandbox Code Playgroud)

编译使用:

g++-9 -std=c++2a -g -o bin/test test/test.cpp
Run Code Online (Sandbox Code Playgroud)

屏幕上显示的结果是:

0 0 0 0
0 1 4 0
0
Run Code Online (Sandbox Code Playgroud)

阅读时似乎出现了问题c,但是我不知道如何纠正它。请帮我!

Tom*_*ann 5

这实际上是一个旧问题,并非专门针对char8_t。C ++ 11和更高版本中char16_t或发生相同的问题char32_t。以下gcc错误报告具有类似的测试用例。

还在下面讨论该问题:

问题是,GCC不会隐式灌输全球语言环境与面的ctype<char8_t>ctype<char16_t>ctype<char32_t>。尝试执行需要这些方面之一的操作时,std::bad_cast会引发异常std::__check_facet(随后,该异常会被为字符提取运算符创建的IOS岗哨对象静默吞下,然后设置badbitfailbit)。

C ++标准只要求ctype<char>ctype<wchar_t>提供。参见[locale.category] ​​p2


归档时间:

查看次数:

100 次

最近记录:

6 年,2 月 前