This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++14 status.

### 2009. Reporting out-of-bound values on numeric string conversions

Section: 21.3.5 [string.conversions] Status: C++14 Submitter: Alisdair Meredith Opened: 2010-07-19 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [string.conversions].

View all issues with C++14 status.

Discussion:

The functions (`w`)`stoi` and (`w`)`stof` are specified in terms of calling C library APIs for potentially wider types. The integer and floating-point versions have subtly different behaviour when reading values that are too large to convert. The floating point case will throw `out_of_bound` if the read value is too large to convert to the wider type used in the implementation, but behaviour is undefined if the converted value cannot narrow to a float. The integer case will throw `out_of_bounds` if the converted value cannot be represented in the narrower type, but throws `invalid_argument`, rather than `out_of_range`, if the conversion to the wider type fails due to overflow.

Suggest that the Throws clause for both specifications should be consistent, supporting the same set of fail-modes with the matching set of exceptions.

Proposed resolution:

21.5p3 [string.conversions]

>     int stoi(const string& str, size_t *idx = 0, int base = 10);
>     long stol(const string& str, size_t *idx = 0, int base = 10);
>     unsigned long stoul(const string& str, size_t *idx = 0, int base = 10);
>     long long stoll(const string& str, size_t *idx = 0, int base = 10);
>     unsigned long long stoull(const string& str, size_t *idx = 0, int base = 10);

> > ...

> > 3 Throws: `invalid_argument` if `strtol`, `strtoul`, `strtoll`, or `strtoull` reports that no conversion could be performed. Throws `out_of_range` if `strtol`, `strtoul`, `strtoll` or `strtoull` sets `errno` to `ERANGE`, or if the converted value is outside the range of representable values for the return type.

21.5p6 [string.conversions]

>     float stof(const string& str, size_t *idx = 0);
>     double stod(const string& str, size_t *idx = 0);
>     long double stold(const string& str, size_t *idx = 0);

> > ...

> > 6 Throws: `invalid_argument` if `strtod` or `strtold` reports that no conversion could be performed. Throws `out_of_range` if `strtod` or `strtold` sets `errno` to `ERANGE` or if the converted value is outside the range of representable values for the return type.