При использовании noexcept, как я могу быть уверен, что мой код не выдаст исключение?

#c #exception

#c #исключение

Вопрос:

Я понимаю, что написание кода, защищенного от исключений, в основном означает учет того, какая часть кода может выдавать исключение, чтобы вы могли предложить некоторую гарантию поведения, когда действительно генерируется исключение. В частности, я полагаю, что лучше всего писать код с гарантией отсутствия ошибок, если ситуация позволяет это.

Дело в том, как я узнаю, что мой код не может выдавать?

Точнее:

  • Допустим, что все функции, которые я использую, не могут выдавать (у них есть noexcept(true) спецификатор, который я проверяю с помощью static_assert , и реализованы для его обеспечения).
  • Зная это, может ли что-то все еще выдавать, например, операции над базовыми типами или вызовы функций (не сама функция, а вызов функции)?
  • Может ли ошибка возникнуть, не приводя к исключению (например, я слышал, что деление int на ноль приводит к ошибке, но не выдает)

Комментарии:

1. Деление на 0, переполнение буфера, безопасность ОС, числовое переполнение и т. Д. И т. Д. «как я могу знать, что мой код никогда не выдаст никаких исключений?» — вы не можете — лучшее, что вы можете сделать, это решить, что делать, если он выдаст исключение.

2. В принципе, все в стандарте, в котором говорится, что он будет выдавать исключение, плюс любое использование ключевого слова throw 🙂

3. @Drax: плюс любое появление UB, естественно.

4. @Deduplicator удачи, полагаясь на это 🙂

5. @Drax: Конечно, я полагаюсь на то, что ему разрешено создавать исключения, я просто не полагаюсь на это. 😉