取自: 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()
不存在short
和int
。因此,它们被更改为使用long
版本,并检查读取数是否在正确的范围内。
缺陷报告在这里。
(这并不能真正解释为什么他们认为他们不能保持最初的预期行为,但这就是为什么标准这一部分被改变了。
非const
参考输入中存储零,x
然后在出错时返回原始值,这更像是一种C++方式。
为了在出现错误条件时保持原始值,库必须使用临时值。 它不能简单地使用 x
提供的空间而不将原始值存储在某处。 然后,一旦知道错误条件,它可能还必须在某个时候执行复制以x
。如果出现错误或读取输入,您还将如何获得原始值。因此,无论他们是否想要这种行为,每个人都要付出代价。
因此,在出现错误的情况下返回原始值根本不C++。 如果您想要这种行为,只需自己付费 - 创建一个临时并将其非const
引用传递给operator>>
,例如:
int x = 1;
int temp;
if (std::cin >> temp)
x = temp;
return x;