Предположим, Foo
конструктор не вызывает функцию, которая влияет errno
или аналогичные коды состояния, такие как GetLastError()
в Windows гарантируется, что
throw Foo
не влияет ни на одно из этих значений. Тем не менее, я могу отложить чтение кода ошибки до конструктора Foo? Если это не указано в стандарте, меня больше всего интересует поведение вариантов GCC, GNU / Linux и MinGW-SJLJ.
Функция GetLastError()
является специфичным для Windows и нестандартным. Исключения не влияют на возвращаемое значение: только вызовы функции ОС обновляют его (если вы не вызываете SetLastError()
).
Тем не менее, создание исключения имеет потенциальное влияние на автоматические объекты, находящиеся в области видимости:
15.2 / 1 Когда управление переходит от точки, где исключение выдается обработчику, деструкторы вызываются для всех автоматических объектов
построено с момента ввода блока try Автоматические объекты
уничтожены в обратном порядке завершения их
строительство.
Если деструктор любого из таких объектов содержит вызов к ОС, это может повлиять на GetLastError()
,
Подвести итоги: Сначала Foo
вызывается конструктор, затем вызывается деструктор уже полностью сконструированных локальных объектов, и, наконец, бросок «передает управление» ближайшему обработчику исключений. Таким образом, библиотечная функция не должна вызываться. Стандарт использует одну и ту же формулировку («управление передачей» или «управление передачей») для любых элементарных операторов управления потоком, таких как break, continue и goto.