【发布时间】:2013-10-22 15:45:48
【问题描述】:
取自:cppreference
直到 C++11:
如果提取失败(例如,如果在需要数字的地方输入了字母),则值保持不变并设置失败位。
C++11 起:
如果提取失败,则将零写入 value 并设置 failbit。如果提取导致值太大或太小而无法容纳在值中,则写入
std::numeric_limits<T>::max()或std::numeric_limits<T>::min()并设置故障位标志。
由于这个变化,这意味着下面的sn-p:
int x = 1;
std::cin >> x;
return x;
如果数值转换失败,在C++11之前返回1,否则返回0。
为什么标准委员会会引入如此微妙的突破性变化?或者更确切地说,在 C++11 之前,什么样的代码可能需要进行这种更改?
【问题讨论】:
-
检查错误是您的责任。这既是
pre-C++11和C++11,也将出现在未来的版本中(很可能)。不检查而是依赖一些实现细节只是你的错。 -
@stefan 这太荒谬了。期望未修改的值依赖于实现细节,但检查故障位不?怎么回事?为什么我们还有接口规范和文档?你能解释一下为什么在“如果提取失败(例如,如果在需要数字的地方输入了一个字母),值保持不变并设置了失败位。” “值未修改”部分是实现细节,但“故障位已设置”部分不是吗?您不能选择性地挑选记录的行为并将其称为实现细节。
-
@stefan 不。这绝对不是实现细节。这是
operator>>的指定行为。它写在规范中。operator>>的指定行为的其他哪些部分您会选择性地忽略? -
@stefan 我的意思是:如果您希望它在错误时返回 1,那么代码就可以了。嗯,是。规范以不兼容的方式更改并不是编写代码的人的错。
-
另请参阅this answer。 看起来,无论如何我们都不能真正依赖这种行为,所以在实践中这并没有太大的损失。