Если звонить что-то вроде input_stream >> i;
где i
имеет арифметический тип, выдает исключение или устанавливает битбит и т. д., гарантируется ли, что i
не изменился?
До C ++ 11 значение было оставлено как есть, [ссылка]:
Если извлечение не удается (например, если была введена буква, где ожидается цифра),
value
остается неизменным иfailbit
установлено. (до C ++ 11)
Но после C ++ 11 нет. Это установлено в 0
если извлечение не удается (та же ссылка):
Если извлечение не удается, записывается ноль в
value
а такжеfailbit
установлено. Если извлечение приводит к значению, слишком большому или слишком маленькому, чтобы соответствовать значению,std::numeric_limits<T>::max()
или жеstd::numeric_limits<T>::min()
написано иfailbit
флаг установлен. (начиная с C ++ 11)
Ссылаясь на документацию cppreference для std::basic_istream::operator>>
std::num_get::get, std::num_get::do_get
:
1-4) Ведет себя как FormattedInputFunction. После создания и проверки объекта sentry, который может пропустить начальные пробелы, извлекается целочисленное значение путем вызова std :: num_get :: get ()
А потом
Этап 3: преобразование и хранение:
[…] — Если функция преобразования не может преобразовать все поле, значение 0 сохраняется в v