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