Довольно простые примеры могут быть построены , которые напрямую связаны с деструкторами, а не с самоанализом в noexcept
состоянии:
void a(int);
void b() noexcept;
void c(int i) {
struct A {
int i;
~A() {a(i);}
} a={i};
b();
a.i=1;
}
Здесь noexcept
позволяет игнорировать инициализацию a
в вызывающей стороне , поскольку деструктор не может ее наблюдать.
struct B {~B();};
void f();
void g() noexcept {
B b1;
f();
B b2;
}
Здесь noexcept
позволяет пропустить информацию о кадре, необходимую в случае, если callee выбрасывает. Это зависит от (очень распространенного) решения не раскручивать стек при вызове std::terminate
.