If calling something like input_stream >> i;
where i
is of arithmetic type, throws exception or sets badbit etc., is it guaranteed that i
has not changed?

- 47,013
- 16
- 123
- 162

- 867
- 7
- 20
2 Answers
Before C++11, the value was left as it was, [reference]:
If extraction fails (e.g. if a letter was entered where a digit is expected),
value
is left unmodified andfailbit
is set. (until C++11)
But after C++11, no. It is set to 0
if extraction fails (same reference):
If extraction fails, zero is written to
value
andfailbit
is set. If extraction results in the value too large or too small to fit in value,std::numeric_limits<T>::max()
orstd::numeric_limits<T>::min()
is written andfailbit
flag is set. (since C++11)

- 47,013
- 16
- 123
- 162
-
3Note that some pre-C++11 implementations failed to comply with that specification – M.M Nov 27 '16 at 12:34
-
@M.M: what proof do you have for this ? – Destructor Nov 27 '16 at 13:01
Referring to the cppreference documentation for std::basic_istream::operator>>
std::num_get::get, std::num_get::do_get
:
1-4) Behaves as a FormattedInputFunction. After constructing and checking the sentry object, which may skip leading whitespace, extracts an integer value by calling std::num_get::get()
And then
Stage 3: conversion and storage:
[...]
- If the conversion function fails to convert the entire field, the value 0 is stored in v

- 165,132
- 21
- 377
- 458