Ist Stack-Abwicklung mit Ausnahmen, die vom C ++ - Standard garantiert werden?

Bezüglich des Abwickelns des Stapels lautet der c ++ - Standard:

Eine Ausnahme gilt nach Abschluss der Initialisierung des Ausnahmeobjekts ([except.throw]) als nicht abgefangen, bis die Aktivierung eines Handlers für die Ausnahme ([except.handle]) abgeschlossen ist. Dies schließt das Abwickeln des Stapels ein.

beimpar 15.5.3 des aktuellen Standards. Ich habe versucht zu verstehen, was der letzte Satz This includes stack unwindings) bezieht sich auf:

wird angenommen, dass der Compiler sich um das Abwickeln des Stapels kümmern muss?oder, heißt das, dass es vom Compiler abhängt, ob der Stack abgewickelt werden soll oder nicht?

Die Frage ergibt sich aus dem folgenden Ausschnitt:

#include <iostream>
#include <exception>

struct S{
    S() { std::cout << " S constructor" << std::endl; }
    virtual ~S() { std::cout << " S destructor" << std::endl; }
};

void f() {
    try{throw(0);}
    catch(...){}
}

void g() {
    throw(10);
}

int main() {
    S s;
    f();
    //g();
}

Jetzt

wenn Sie es ausführen, wie es ist (Ausnahme abfangen), haben Sie einen Hinweis auf den Stapel, der sich abwickeltwenn Sie kommentierenf(); und uncommentg(); (Ausnahme wird nicht abgefangen), Sie haben den Hinweis, dass der Stapel nicht abgewickelt wird.

So scheinen die zwei Experimente für die erste Kugel oben zu sein; Sowohl clang ++ als auch g ++ stimmen in Bezug auf das Ergebnis überein (es ist jedoch keine Diskriminante).

Auch scheint es mir sehr seltsam, dass der Standard, der bei der Angabe des Objekts wirklich vorsichtig istLebenszei undDaue hinterlässt hier einen Schatten.

Kann jemand klarstellen? Ist das Abwickeln des Stapels für nicht erfasste Ausnahmen durch den Standard garantiert? Wenn ja, wo? Wenn nicht, warum?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage