GCC 4.8 和 char16_t 流 - 错误

GCC 4.8 and char16_t streams - bug?

本文关键字:错误 char16 GCC      更新时间:2023-10-16

这是一个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);

该标准不要求实现支持除 charwchar_t 之外的任何类型的流。

[iostreams.limits.pos]

在子句 27 的类中,名称为 charT 的模板参数表示包含 charwchar_t 和任何其他实现定义的字符类型的类型集的成员,这些类型类型满足可以实例化任何 iostream 组件的字符的要求。

此外,它也不需要用于从流中提取整数和浮点数的分面来处理char16_t

[类别.数字]

22.4.2子条款中用于num_putnum_get的所有成员函数规范仅适用于表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 的模板参数表示包含以下内容的类型集 charwchar_t 和任何其他实现定义的字符类型,这些字符类型满足可以实例化任何 iostream 组件的字符的要求。

该标准仅要求char_traits(因此basic_string)和codecvt正常工作,用于char16_tchar32_t

因此,为了使您的函数正常工作,您基本上需要定义库未提供的所有缺失部分的专用化。