GCC 4.8和char16_t流 - bug?

时间:2015-02-03 08:10:44

标签: c++ gcc unicode iostream libstdc++

这是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 个答案:

答案 0 :(得分:1)

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

[iostreams.limits.pos]

  

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

此外,它不需要用于从流中提取整数和浮点数的构面与char16_t一起使用:

[category.numeric]

  

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

标准只要求wchar_t(以及char_traits}和basic_string正常使用codecvtchar16_t

因此,为了使您的功能正常工作,您基本上需要定义库不提供的所有缺失部分的特化。