Возьмите из: cppreference
До С++ 11:
Если извлечение завершится неудачно (например, если была введена буква, в которой ожидается цифра), значение остается неизмененным и устанавливается битбит.
Так как С++ 11:
Если извлечение завершилось неудачно, нуль записывается в значение и устанавливается failbit. Если извлечения приводит к слишком большому или слишком маленькому значению, чтобы соответствовать значению, записывается
std::numeric_limits<T>::max()
илиstd::numeric_limits<T>::min()
, и устанавливается флаг сбоя.
Из-за этого изменения это означает, что следующий фрагмент:
int x = 1;
std::cin >> x;
return x;
если числовое преобразование не выполнено, вернет 1
до С++ 11 и 0
в противном случае.
Почему стандартный комитет внесет такое незначительное изменение? Вернее, какой код был возможен до С++ 11, который гарантировал это изменение?