失败后,C ++中的istream行为发生变化

从: cppreference

直到C ++ 11:

如果提取失败(例如,如果input的字母是数字所在的位置),值将保持不变,并设置失败位。

由于C ++ 11:

如果提取失败,写入零值并设置失败位。 如果提取的结果是值太大或太小std::numeric_limits<T>::max()适合值,则写入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版本,并检查读数落在正确的范围内。

缺陷报告在这里 。

(这并不能解释为什么他们不认为他们可以保持原本的预期行为,但这就是为什么“标准”的这一部分发生了变化。)

这更多的是C ++的方法,在非const引用inputx存储零,然后在错误的情况下返回原始值。

为了在出现错误的情况下保持原始值,图书馆将不得不临时工作。 它不能简单地使用x提供的空间而不将原始值存储在某处。 那么一旦错误条件已知,它可能还必须在某个时刻拷贝到x 。 否则,如果出现错误或读取input,您还将获得原始值。 所以每个人都付出代价,不pipe他们是否想要这样的行为。

所以如果错误返回原来的值不是C ++。 如果你想要这个行为只需要自己付钱 – 创build一个临时的,并将其非const引用传递给operator>> ,如下所示:

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