2008-12-02 16 views
16

Dieser Code führt zu undefinierten Verhalten:Sind Goto und Destruktoren kompatibel?


void some_func() { 
    goto undefined; 
    { 
    T x = T(); 
    undefined: 
    } 
} 

Der Konstruktor wird nicht aufgerufen.

Aber was ist mit diesem Code? Wird der Destruktor von x aufgerufen? Ich denke, es wird so sein, aber ich möchte mir sicher sein. :)

+0

Das erste Codebeispiel führt nicht zu undefiniertem Verhalten, es ist illegal und wird nicht kompiliert. –

+0

"wird nicht kompilieren" ist ein Beispiel für undefiniertes Verhalten, denke ich. Das Buch, das ich gerade lese, sagt "undefiniertes Verhalten". –

+2

Die beiden sind technisch unterschiedlich: Wenn der Compiler das Programm ablehnen muss, ist das "weniger schlecht" vom POV des Programmierers als etwas, das kompilieren und sein Haus in Brand setzen könnte, wenn es läuft. Einige Compiler lehnen Dinge ab, die legal sind, aber der Compiler weiß, dass sie undefiniert sind. –

Antwort

42

Ja, Destruktoren werden wie erwartet aufgerufen, das gleiche wie wenn Sie den Bereich wegen einer Ausnahme vorzeitig beendet haben.

Standard-6.6/2 (Jump-Anweisungen):

Beim Verlassen Umfang (jedoch erreicht) werden Destruktoren für alle konstruierten Objekte mit automatischer Speicherdauer genannt, die in diesem Umfang deklariert sind, in umgekehrter Reihenfolge ihrer Erklärung.

+0

Haben Sie ein Zitat aus dem Standard dazu? –

Verwandte Themen