Here's a test case for the problem I point out in c++std-lib-17897. It shows that operator>>(int&) behaves differently (and, I claim, incorrectly) from operator>>(long&) or any other extractor except the one for short (which is affected for the same reason). $ cat t.cpp && g++ t.cpp -static && ./a.out #include <cassert> #include <locale> #include <sstream> struct NumPunct: std::numpunct<char> { std::string do_grouping () const { return "\3"; } char do_thousands_sep () const { return ';'; } }; template <class T> T extract (const char *s) { std::istringstream strm (s); strm.imbue (std::locale (strm.getloc (), new NumPunct)); T x = T (); strm >> x; assert ((strm.failbit | strm.eofbit) == strm.rdstate ()); return x; } int main () { assert (123L == extract<long>("1;2;3")); assert (123 == extract<int>("1;2;3")); } Assertion failed: 123 == extract<int>("1;2;3"), file t.cpp, line 26 Abort (core dumped)
The resolution of the DR is implemented in mainline.
Fixed.