libc++ отвечает на 27.7.2.1 [istream]/p4, который описывает basic_istream
синтаксический анализ operator>>
для unsigned
:
Если одна из этих вызываемых функций выдает исключение, то, если явно не указано иное, входная функция устанавливает бэдбит в состояние ошибки. Если в exceptions() включен badbit, входная функция повторно выдает исключение, не завершая свои действия, в противном случае она ничего не выбрасывает и продолжает работу так, как если бы вызванная функция вернула индикацию ошибки.
If:
is.exceptions(std::ios::failbit | std::ios::badbit);
то желаемое поведение достигается.
123
456
789
Fail
Обновить
Чико правильно указал в комментариях ниже, что он ожидал, что getline(is, s, ',')
выкинет, а не экстрактор unsigned
.
Глядя на 21.4.8.9 [string.io]/p7, который описывает этот getline
:
Эффекты: ведет себя как неформатированная функция ввода (27.7.2.3), за исключением того, что она не влияет на значение, возвращаемое последующими вызовами basic_istream‹>::gcount(). После построения объекта часового, если часовой преобразуется в значение true, вызывается функция str.erase(), а затем извлекается символы из is и добавляется к строке str, как если бы вызывалась функция str.append(1, c) до тех пор, пока не произойдет одно из следующих событий: . ..
Итак, вопрос становится:
Как ведет себя функция неформатированного ввода?
27.7.2.3 [istream.unformatted]/p1 говорит:
Каждая неформатированная входная функция начинает выполнение с создания объекта класса sentry с аргументом по умолчанию noskipws (второй) аргумент true. Если объект часового возвращает true, при преобразовании в значение типа bool функция пытается получить запрошенный ввод. В противном случае, если конструктор часового завершает работу, вызывая исключение, или если объект часового возвращает false, при преобразовании в значение типа bool функция возвращается, не пытаясь получить какие-либо входные данные. В любом случае количество извлеченных символов равно 0; неформатированные входные функции, принимающие массив символов ненулевого размера в качестве аргумента, также должны хранить нулевой символ (используя charT()) в первом месте массива. Если во время ввода возникает исключение, ios::badbit включается315 в *этом состоянии ошибки. (Исключения, выдаваемые из basic_ios‹>::clear(), не перехватываются и не создаются повторно.) Если (exceptions()&badbit) != 0, то исключение создается повторно. Также подсчитывается количество извлеченных символов. Если исключение не было выдано, оно завершается сохранением счетчика в объекте-члене и возвратом указанного значения. В любом случае сторожевой объект уничтожается перед выходом из неформатированной функции ввода.
315) Это делается без выдачи ios::failure.
(курсив добавлен мной для удобства чтения)
Таким образом, это снова указывает на то, что если требуется исключение из этой операции синтаксического анализа, badbit
должно быть установлено в exceptions
.
person
Howard Hinnant
schedule
10.05.2013
_LIBCPP_NO_EXCEPTIONS
? - person ecatmur   schedule 09.05.2013