取自:参考参数
直到 C++11:
如果提取失败(例如,如果在需要数字的地方输入了字母),则值保持不变并设置失败位。
自 C++11 起:
如果提取失败,则将零写入值并设置失败位。如果提取结果导致值太大或太小而无法适应值,std::numeric_limits<T>::max()
or std::numeric_limits<T>::min()
被写入并设置故障位标志。
由于这一变化,这意味着以下代码片段:
int x = 1;
std::cin >> x;
return x;
如果数值转换失败,将返回1
C++11 之前,以及0
否则。
为什么标准委员会要引入如此微妙的突破性变化?或者更确切地说,在 C++11 之前什么样的代码可以保证这种更改?
看来按照最初的规定,operator>>
在某些情况下,s 被破坏了(即严格来说不可能存在)。
这就是“修复”。
在 2011 年初的草案中,该标准在这方面与 2003 年基本相同。然而,在 Matt Austern 公开的库缺陷报告中(1998 年!),num_get<>::get()
不存在于short
and int
。
所以他们被改为使用long
版本,并检查读取数是否在正确范围内。
缺陷报告是here.
(并没有真正解释为什么他们认为他们不能保留最初预期的行为,但这就是标准的这一部分被更改的原因。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)