Definiując funkcję można jawnie wyspecyfikować, czy w ogóle i jakiego typu wyjątki mogą zostać zgłoszone, a nieobsłużone podczas jej wykonywania.
Obecnie zaleca się stosowanie tylko dwóch form takich specyfikacji, jak pokazano poniżej:
int f(int i) noexcept; int g(int i);Deklarujemy tu, że funkcja f nie zgłasza wyjątku; jeśli się mimo to zdarzy, program natychmiast się zakończy przez wywołanie terminate. Funkcja g natomiast może zgłaszać dowolny wyjątek. Specyfikacja wyjątków należy do sygnatury funkcji i musi być powtórzona przy każdej deklaracji i (jednej) definicji.
Specyfikator noexcept może pobierać argument typu (konwertowalnego do) bool; dwie powyższe deklaracje są równoważne
int f(int i) noexcept(true); int g(int i) noexcept(false);noexcept może być też użyty jako operator; na przykład For example
void m(int) noexcept(noexcept(f(i))); void n(int) noexcept(noexcept(g(i)));znaczy, że funkcja m ma taką samą specyfikację jak f natomiast n taką samą jak g (oczywiście, f(i) i g(i) nie oznaczają tu rzeczywistego wywołania funkcji).
Jeśli taka fraza została podana dla metody wirtualnej, to wszystkie wersje przesłaniające tę metodę w klasach pochodnych mogą być mniej restrykcyjne, ale nigdy bardziej.
T.R. Werner, 23 lutego 2022; 19:40