Với bản nâng cấp gần đây của tôi lên Mac OS X 10.9, thư viện C++ chuẩn mặc định đã thay đổi từ libstdC++ thành libC++. Kể từ đó tôi quan sát hành vi bất ngờ của toán tử stringstream >> (double) được ghi lại trong ví dụ mã dưới đây.Sự khác biệt giữa toán tử của istream >> (double & val) giữa libC++ và libstdC++
Tóm lại, libC++ dường như có vấn đề với việc trích xuất các giá trị kép từ chuỗi khi giá trị kép được theo sau bởi một chữ cái.
Tôi đã kiểm tra tiêu chuẩn (2003) nhưng tôi không thể tìm thấy bất kỳ thông tin cụ thể nào nếu việc trích xuất có hiệu quả trong trường hợp này hay không.
Vì vậy, tôi sẽ biết ơn bất kỳ đầu vào nào cho dù đây là lỗi trong libC++ hoặc libstdC++.
#include <sstream>
#include <iostream>
using namespace std;
void extract_double(const string & s)
{
stringstream ss;
double d;
ss << s;
ss >> d;
if(!ss.fail())
cout << "'" << ss.str() << "' converted to " << d << endl;
else
cout << "'" << ss.str() << "' failed to convert to double" << endl;
}
int main()
{
extract_double("-4.9");
extract_double("-4.9 X");
extract_double("-4.9_");
extract_double("-4.9d");
extract_double("-4.9X");
}
Biên dịch mã với c++ --stdlib=libc++ streamtest.cxx
cho
'-4.9' converted to -4.9
'-4.9 X' converted to -4.9
'-4.9_' converted to -4.9
'-4.9d' failed to convert to double
'-4.9X' failed to convert to double
Biên dịch mã với c++ --stdlib=libstdc++ streamtest.cxx
cho
'-4.9' converted to -4.9
'-4.9 X' converted to -4.9
'-4.9_' converted to -4.9
'-4.9d' converted to -4.9
'-4.9X' converted to -4.9
phiên bản Compiler là
$ c++ --version
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
Địa phương là 'C' trong cả hai trường hợp. –