Некоторые подводные камни, которые следует учитывать при использовании noexcept в C++:
- Нарушение гарантии noexcept. 1 Если исключение выйдет из функции, помеченной noexcept, это вызовет вызов std::terminate, что эффективно остановит программу. 1 Ошибки в таком случае могут привести к неожиданным и трудноотлаживаемым завершениям. 1
- Различие между передачей параметров и телом функции. 1 Инициализация и уничтожение параметров происходят вне контекста полного выражения функции. 1 Это значит, что исключения, выброшенные во время построения параметров, не нарушают гарантию noexcept, потому что обрабатываются до входа в функцию. 1
- Влияние на производительность. 4 Если перемещающие операторы не помечены спецификатором noexcept, компилятор предпочтёт не рисковать и выберет копирующие операции. 4
- Требования к вызовам функций. 2 Функцию можно помечать noexcept только в том случае, если все функции, которые она вызывает напрямую или косвенно, также noexcept или const. 2