为什么std :: cin会修改其操作数的值,即使它失败了?

时间:2016-01-08 02:55:03

标签: c++ c++11 input

我坚信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?!
}

Live on Coliru

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标准。

0 个答案:

没有答案