On std::istream& std::istream::operator>>(std::istream&, int&)
, cppreference says:
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()
...
If extraction fails, zero is written to value and failbit is set. If extraction results in the value too large or too small to fit in value, std::numeric_limits<T>::max()
or std::numeric_limits<T>::min()
is written and failbit flag is set. (since c++11)
It's not normative, but it does provide a decent summary of what is happening here.
FormattedInputFunctions will construct a sentry from the stream and check the value. If the sentry object evaluates as false
, then no input is performed.
The sentry object will evaluate as false
if, among other situations, the stream being operated on has the failbit set.
So, what's happening is this:
- The stream tries to read in an integer too large to hold in the
int
data type.
- The
int
passed into its function is set to the maximum possible value an int
can store.
- The stream passed into the function has its failbit set.
- Further reads to the stream fail and do nothing, because the stream's failbit is set.
You can detect these overflow errors by checking the failbit and value of the integer after the read operation you are performing, as mentioned in the accepted answer to the question Read int from istream, detect overflow.
You can recover from these errors by unsetting the failbit with std::basic_ios::clear
. Following a call to clear
which unsets the failbit, further reads will behave as you expect.