У меня был прекрасный разговор с кем-то о падениях std::stoi
. Если говорить откровенно, он использует std::strtol
внутренне и бросает, если это сообщает об ошибке. По их мнению, std::strtol
не должен сообщать об ошибке для ввода "abcxyz"
, вызывая stoi
не бросать std::invalid_argument
.
Прежде всего, вот две программы, проверенные на GCC о поведении этих случаев:
strtol
stoi
Оба из них показывают успех на "123"
и сбой на "abc"
.
Я посмотрел в стандарте, чтобы получить дополнительную информацию:
§ 21.5
Throws: invalid_argument if strtol, strtoul, strtoll, or strtoull reports that
no conversion could be performed. Throws out_of_range if the converted value is
outside the range of representable values for the return type.
Это суммирует поведение, полагающееся на strtol
. Как насчет strtol
? Я нашел это в проекте C11:
§7.22.1.4
If the subject sequence is empty or does not have the expected form, no
conversion is performed; the value of nptr is stored in the object
pointed to by endptr, provided that endptr is not a null pointer.
Учитывая ситуацию прохождения в "abc"
, стандарт C определяет, что nptr
, который указывает на начало строки, будет храниться в endptr
, указатель прошел. Это похоже на тест, Кроме того, 0 должно быть возвращено, как указано в следующем:
§7.22.1.4
If no conversion could be performed, zero is returned.
В предыдущей ссылке говорилось, что никакого преобразования не будет выполнено, поэтому он должен вернуть 0. Эти условия теперь соответствуют стандарту С++ 11 для stoi
throwing std::invalid_argument
.
Результат этого имеет значение для меня, потому что я не хочу идти, рекомендуя stoi
как лучшую альтернативу другим методам преобразования строки в int или использовать его сам, как если бы он работал так, как вы ожидали, если он не воспринимает текст как недопустимое преобразование.
Итак, после всего этого, я где-то ошибся? Мне кажется, что у меня есть хорошее доказательство того, что это исключение выбрасывается. Является ли мое доказательство действительным или std::stoi
не гарантированно бросает это исключение при задании "abc"
?