失败时,iStream 行为会在C++中更改

  • 本文关键字:C++ iStream 失败 c++ c++11
  • 更新时间 :
  • 英文 :


取自: cpp首选项

直到C++11:

如果提取失败(例如,如果在预期数字的位置输入了一个字母),则值保持不变并设置故障位。

自C++11以来:

如果提取失败,则将零写入值并设置故障位。如果提取导致值太大或太小而无法容纳值,则写入std::numeric_limits<T>::max()std::numeric_limits<T>::min()并设置 failbit 标志。

由于此更改,这意味着以下代码片段:

int x = 1;
std::cin >> x;
return x;

如果数值转换失败,将在 C++11 之前返回1,否则0

为什么标准委员会会引入如此微妙的突破性更改?或者更确切地说,在 C++11 之前,什么样的代码可以保证这种更改?

似乎按照最初的规定,operator>>在某些情况下被破坏了(即严格来说不存在)。这是"修复"。

在2011年初的草案中,该标准在这方面与2003年基本相同。然而,在Matt Austern(1998年!)打开的图书馆缺陷报告中,num_get<>::get()不存在shortint。因此,它们被更改为使用long版本,并检查读取数是否在正确的范围内。

缺陷报告在这里。

(这并不能真正解释为什么他们认为他们不能保持最初的预期行为,但这就是为什么标准这一部分被改变了。

const参考输入中存储零,x然后在出错时返回原始值,这更像是一种C++方式。

为了在出现错误条件时保持原始值,库必须使用临时值。 它不能简单地使用 x 提供的空间而不将原始值存储在某处。 然后,一旦知道错误条件,它可能还必须在某个时候执行复制以x。如果出现错误或读取输入,您还将如何获得原始值。因此,无论他们是否想要这种行为,每个人都要付出代价。

因此,在出现错误的情况下返回原始值根本不C++。 如果您想要这种行为,只需自己付费 - 创建一个临时并将其非const引用传递给operator>>,例如:

int x = 1;
int temp;
if (std::cin >> temp) 
    x = temp;
return x;

最新更新