In C streams, the behavior of failure handling differs depending on the stream type and the version of the language. This discrepancy is exemplified by the unexpected behavior observed when reading a word into an integer variable using stringstream.
Traditionally, as stated in Stroustrup's TC PL (3rd Edition), if an input operation fails, the target variable should remain unaltered in certain data types. However, when encountering a type mismatch in stringstream, the variable's value is modified, contradicting the cited quote.
The reason for this discrepancy lies in the change implemented in C 11. Pre-C 11, stringstream employed scanf-style parsing to extract numbers. In C 11, this method was replaced with calling functions such as std::strtoll, which modify the target in case of failure.
Consequently, the change in parsing strategy introduced different failure behavior. Before C 11, the target remained unmodified, while in C 11 and later, the target is set to zero on failure.
To verify this theory, consult a reference such as the one provided in the answer. This reference explains that prior to C 11, failure in extraction left the value unmodified and set the failbit. However, in C 11 and onward, failure results in a zero value for the target and the failbit being set.
Additionally, the reference states that the input operator relies on the num_get locale facet, which utilizes the do_get function. In C 11, do_get has been modified to use std::strtoll and similar functions, thus causing the observed behavior change.
The above is the detailed content of Why Does C Stringstream\'s Failure Handling Differ Before and After C 11?. For more information, please follow other related articles on the PHP Chinese website!