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.
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
)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
ifstrtol
,strtoul
,strtoll
, orstrtoull
reports that no conversion could be performed. Throwsout_of_range
ifstrtol
,strtoul
,strtoll
orstrtoull
setserrno
toERANGE
, 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
ifstrtod
orstrtold
reports that no conversion could be performed. Throwsout_of_range
ifstrtod
orstrtold
setserrno
toERANGE
or if the converted value is outside the range of representable values for the return type.