从 g++/stdlib++ 和 clang++/libc++ 之间的流中读取双精度的区别

Difference reading a double from stream between g++/stdlib++ and clang++/libc++

提问人:David Lehavi 提问时间:10/4/2023 更新时间:10/4/2023 访问量:80

问:

最小的“失败”示例:

#include <assert.h>
#include <iostream>
#include <string>
#include <sstream>
int main(int argv, char** argc) {
  std::string line = "1.1", line2 = "1.1X";
  std::istringstream iss(line), iss2(line2);
  double x;
  assert(iss >> x);
  std::cout << x << "\n" << std::flush;
  assert(iss2 >> x);
  std::cout << x << "\n";
  return 0;
}

使用 clang 运行:

>clang++ -stdlib=libc++ reading_double.cc -o reading_double
>./reading_double 
1.1
reading_double: reading_double.cc:11: int main(int, char **): Assertion `iss2 >> x' failed.
Aborted (core dumped)
>clang --version
Ubuntu clang version 18.0.0 (++20231004042239+548d67a0393c-1~exp1~20231004042400.1224)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

使用 gcc 运行:

>g++ reading_double.cc -o reading_double
>./reading_double 
1.1
1.1
>g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

哪个是正确的行为?(在我看来,libc++ 是错误的)

C gcc clang stringstream libc++

评论

0赞 Fareanor 10/4/2023
看来咔嚓一声是错的。也可以从中提取一个,所以我不明白为什么断言失败。doubleiss2
1赞 Bob__ 10/4/2023
它似乎与错误 17782 有关。另请参阅 stackoverflow.com/questions/24689378/... 或 stackoverflow.com/questions/37459179/...
0赞 David Lehavi 10/4/2023
@Bob__ 那么,我应该将其标记为重复吗?或者你应该把你的评论作为答案,以便我可以接受它(你提到的问题有点误导 IMO,但错误报告是正确的)
1赞 Bob__ 10/4/2023
可能还有更多的被欺骗的候选者,该错误报告是在将近十年前发布的,而 Marshal Clow 提交的 LWG 2381 修复标准甚至没有解决您的特定情况 ()。如果您没有找到更合适的欺骗目标,请随时发布自我答案。'X'

答:

0赞 David Lehavi 10/4/2023 #1

根据评论中与@Bob_的讨论。 这是 libc++ 中的已知错误 我发现的关于这个错误的最深入的讨论是在

https://github.com/tardate/LittleCodingKata/blob/main/cpp/DoubleTrouble/README.md