Ответ 1
21,5 Числовые преобразования
unsigned long stoul(const string& str, size_t *idx = 0, int base = 10);
Эффекты:... call [s]
strtoul(str.c_str(), ptr, base)
... возвращает преобразованный результат, если он есть.Выдает:...
out_of_range
, если преобразованное значение находится за пределами диапазона представляемых значений для возвращаемого типа.
"Преобразованное значение" здесь - значение, возвращаемое strtoul
. Который, конечно, имеет тип unsigned long
и поэтому не может находиться за пределами диапазона представляемых значений для возвращаемого типа stoul
, который также является unsigned long
.
Насколько я могу судить, только stoi
может бросать out_of_range
, потому что он возвращает int
, но использует strtol
, который возвращает long
.
Кроме того, способ C указывает strtoul
, требуется принять строку "-4"
и вернуть значение, равное -(unsigned long)4
. Почему это указано таким образом, я не знаю.