![](/img/trans.png)
[英]C++ istream tellg()/fail() on eof: behavior change; work-around?
[英]istream behavior change in C++ upon failure
来自: cppreference
直到C ++ 11:
如果提取失败(例如,如果在预期的数字中输入了字母),则值将保持不变,并设置故障位。
从C ++ 11开始:
如果提取失败,则将零写入值并设置故障位。 如果提取导致值太大或太小而无法容纳该值,则将
std::numeric_limits<T>::max()
或std::numeric_limits<T>::min()
写入并设置故障位标志。
由于此更改,这意味着以下代码段:
int x = 1;
std::cin >> x;
return x;
如果数值转换失败,将在C ++ 11之前返回1
,否则返回0
。
标准委员会为什么要引入如此微妙的突破性变化? 或者更确切地说,在C ++ 11之前什么样的代码可以保证进行此更改?
似乎像最初指定的那样,在某些情况下, operator>>
是坏掉的(即严格来说是不存在的)。 这是“修复”。
在2011年初的草案中,标准在这方面与2003年基本相同。但是,在Matt num_get<>::get()
打开的库缺陷报告(于1998年!)中, num_get<>::get()
并没有存在于short
和int
。 因此将它们更改为使用long
版本,并检查读取的数量是否在正确的范围内。
缺陷报告在这里 。
(并没有真正解释他们为什么不认为自己可以保留最初打算的行为,但这就是为什么本标准的这一部分被更改的原因。)
C ++的处理方式更多是将零存储在非const
引用输入x
然后在出现错误的情况下返回原始值。
为了在发生错误的情况下保留原始值,该库必须使用临时库。 它不能简单地使用x
提供的空间而不将原始值存储在某个地方。 一旦知道了错误条件,它有时也可能必须复制到x
。 如果出现错误,否则将如何获取原始值? 因此,无论是否需要这种行为,每个人都付出代价。
因此,发生错误时返回原始值根本不是C ++。 如果您想让这种行为简单地自己付钱-创建一个临时文件并将其非const
引用传递给operator>>
,例如:
int x = 1;
int temp;
if (std::cin >> temp)
x = temp;
return x;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.