我坚信std::basic_istream::operator>>
是“事务安全”,即如果失败,它将保持操作数不变。所以,我期望以下代码
#include <iostream>
#include <sstream>
int main()
{
std::stringstream ss("a");
int i = 42;
ss >> i; // extraction fails
std::cout << i; // modifies i, WHY?!
}
i
的值将保持42
。但是,从C ++ 11开始,这似乎不再是这种情况,并且操作数在失败时归零。引自cppreference.com
(强调我的)
如果提取失败(例如,如果输入了预期数字的字母),则
value
保持不变,并设置failbit
。 (直到C ++ 11 )如果提取失败,则零写入
value
并设置failbit
。如果提取导致值太大或太小而无法拟合,则会写入std::numeric_limits<T>::max()
或std::numeric_limits<T>::min()
并设置failbit
标记。 (,因为C ++ 11 )
任何人都可以解释这次修改的原因是什么?至少可以说,我发现这种行为是不可取的。即使我使用-std=c++98
进行编译,gcc5.3和clang3.6仍然符合C ++ 11标准。