Issue 2009: Reporting out-of-bound values on numeric string conversions (original) (raw)


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: 27.4.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)stofare 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 throwsinvalid_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 ifstrtol, strtoul, strtoll orstrtoull sets errno to ERANGE, or ifthe 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 orstrtold reports that no conversion could be performed. Throwsout_of_range if strtod or strtold setserrno to ERANGE or if the converted value is outside the range of representable values for the return type.