为什么在解析为double时此字符串流会失败?

The*_*ton 5 c++ stringstream libc++

我有以下代码:

#include <string>
#include <iostream>
#include <sstream>

int main()
{
        size_t x, y;
        double a = std::stod("1_", &x);
        double b = std::stod("1i", &y);

        std::cout << "a: " << a << ", x: " << x << std::endl;
        std::cout << "b: " << b << ", y: " << y << std::endl;

        std::stringstream s1("1_");
        std::stringstream s2("1i");

        s1 >> a;
        s2 >> b;

        std::cout << "a: " << a << ", fail: " << s1.fail() << std::endl;
        std::cout << "b: " << b << ", fail: " << s2.fail() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我想解析一个double并在遇到无效字符时停止.在这里,我尝试分析"1_""1i",这两者应该给我用值双:1.

这是我的输出:

a: 1, x: 1
b: 1, y: 1
a: 1, fail: 0
b: 0, fail: 1
Run Code Online (Sandbox Code Playgroud)

所以stod函数按预期工作,但stringstream方法没有.对我来说,在标准库中解析double的两种标准方法会产生不同的结果是没有意义的吗?

解析时为什么stringstream方法失败:"1i"

编辑:

这似乎给某些人带来了不同的结果.我的编译器信息如下:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Run Code Online (Sandbox Code Playgroud)

EDIT2:

这是libc ++的一个错误,还是规范只是模糊了什么算作双重的有效解析?

T.C*_*.C. 7

这是一个libc ++ bug.根据[facet.num.get.virtuals] bullet 3.2,如果允许字符作为在阶段1(%gfor double)中确定的转换说明符的输入字段的下一个字符,则应该累积该字符.累积后1,i不允许,因此第2阶段应该终止.

libc ++不加选择地累积字符,直到它到达非原子字符(它还将原子扩展为include i,这是解析inf所必需的).