При разработке на C++ время от времени приходится писать код, в котором исключения не должны возникать. Например, когда нам нужно написать не бросающий исключений swap для собственных типов или определить noexcept move-оператор для своего класса, или вручную реализовать нетривиальный деструктор.
В С++11 в язык был добавлен модификатор noexcept, который позволяет разработчику понять, что из помеченной noexcept-ом функции (или метода) исключения вылететь не могут. Поэтому функции с такой пометкой могут смело использоваться в контекстах, где исключения не должны возникать.
Например, если у меня есть вот такие типы и функции:
class first_resource {...};
class second_resource {...};
void release(first_resource & r) noexcept;
void close(second_resource & r);
и есть некий класс resources_owner, который владеет объектами типа first_resource и second_resource:
class resources_owner {
first_resource first_resource_;
second_resource second_resource_;
...
};
то я могу написать деструктор resources_owner следующим образом:
resources_owner::~resources_owner() noexcept {
// Функция release() не бросает исключений, поэтому просто вызываем ее.
release(first_resource_);
// А вот функция close() может бросать исключения, поэтому
// обрамляем ее try-catch.
try{ close(second_resource_); } catch(...) {}
}
В каком-то смысле noexcept в C++11 сделал жизнь C++ разработчика легче. Но у текущей реализации noexcept в современном C++ есть одна неприятная сторона...
Компилятор не помогает контролировать содержимое noexcept функций и методов