goto
или switch
может перескакивать через выражение-выражение, учитывая, что у него нет инициализатора, а конструкция тривиальна и что объект также тривиально разрушаемый.
Какое обоснование ограничения на деструктор?
struct trivial {
trivial() = default;
~ trivial() = default;
};
struct semi_trivial {
semi_trivial() = default;
~ semi_trivial() noexcept { do_something(); }
};
void foo() {
goto good_label; // OK
trivial foo;
good_label:
goto bad_label; // Error: this goto statement
semi_trivial bar; // cannot jump over this declaration.
bad_label:
std::cout << "hi\n";
}