c++ - g++ 和 clang++ 对流输入和无符号整数的不同行为

标签 c++ clang++ libstdc++ libc++ istringstream

我遇到了 gcc (4.9.2) 和 clang (3.5.0) 之间的行为差​​异,这让我很惊讶。

当我尝试喂一个 unsigned int来自 std::istringstream用负值初始化(在示例中为“-15”)我得到

  • clang++ 出现错误(fail() 位已引发)
  • 使用 signed(-15) 进行初始化使用 gcc++

我准备了以下简单的示例程序。

#include <sstream>
#include <iostream>

int main ()
 {
   std::istringstream iss("-15");

   unsigned int  ui;

   iss >> ui;

   std::cout << "ui[" << ui << "] signed(ui)[" << signed(ui)
      << "] flags[" << iss.fail() << iss.good() << iss.bad()
      << iss.eof() << "]\n";

   return 0;
 }

使用 clang++,我得到以下输出

ui[0] signed(ui)[0] flags[1001]

使用 g++,我得到以下输出

ui[4294967281] signed(ui)[-15] flags[0001]

我有两个问题。

第一个很明显:谁是对的? clang++、g++ 还是未定义的行为?

第二个是:如何强制gcc++表现得像clang++,从以减号开头的字符串中提取无符号值时出错?

感谢和抱歉我的英语不好。

编辑 2016.04.03

我意识到这不是 g++ 和 clang++ 的区别,而是 libstd++ 和 libc++ 的区别。

使用 clang++ 和 libstd++ 编译和链接,我获得了与 g++ 相同的输出。

对不起。

最佳答案

这里之前已经讨论过:Negative numeric string (e.g. "-10") to unsigned short

答案是根据C++标准22.4.2.1.2p3,要求转换失败,值存储应该是:

the most negative representable value or zero for an unsigned integer type, if the field represents a value too large negative to be represented in val. ios_base::failbit is assigned to err.

因此,clang++ 是正确的行为。

关于c++ - g++ 和 clang++ 对流输入和无符号整数的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36377836/

相关文章:

c++ - 这个编译器错误是由无效代码触发的,还是应该编译?

c++ - 将 libstdc++ 静态链接是一个好习惯吗?

c++ - 模板化固定 + 可变大小类

c++ - 将 cin 用于 char 数组

c++ - 32 位 PPC rlwinm 指令

c++ - 由泛型函数设置的数组绑定(bind)

linker - 建库时clang和clang++有什么区别?

C++微软的ComPtr和c++的unique_ptr、shared_ptr有什么区别?

linux - 加载共享库 : libstdc++. so.6 时出错:无法打开共享对象文件:没有这样的文件

c++ - std::call_once() 在 callable 抛出第一次调用后在第二次调用时挂起