У меня был прекрасный разговор с кем-то о падениях 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"?