Как показано в http://ideone.com/RdINqa, std::stoul не выбрасывает std::out_of_range для отрицательных чисел, но обертывает их. Почему это? Кажется, что -4 находится вне диапазона типа unsigned long, поэтому он должен бросать.
Почему std:: stoul конвертирует отрицательные числа?
Ответ 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. Почему это указано таким образом, я не знаю.