Гарантируется ли, что стандартный оператор извлечения & gt; & gt; не меняет аргумент в случае неудачи?

Если звонить что-то вроде input_stream >> i; где i имеет арифметический тип, выдает исключение или устанавливает битбит и т. д., гарантируется ли, что i не изменился?

1

Решение

До C ++ 11 значение было оставлено как есть, [ссылка]:

Если извлечение не удается (например, если была введена буква, где ожидается цифра), value остается неизменным и failbit установлено. (до C ++ 11)

Но после C ++ 11 нет. Это установлено в 0 если извлечение не удается (та же ссылка):

Если извлечение не удается, записывается ноль в value а также failbit установлено. Если извлечение приводит к значению, слишком большому или слишком маленькому, чтобы соответствовать значению, std::numeric_limits<T>::max() или же std::numeric_limits<T>::min() написано и failbit флаг установлен. (начиная с C ++ 11)

5

Другие решения

Ссылаясь на документацию 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

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector