失败后,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()
没有存在的short
和int
。 所以他们改为使用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;