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. :)
Das erste Codebeispiel führt nicht zu undefiniertem Verhalten, es ist illegal und wird nicht kompiliert. –
"wird nicht kompilieren" ist ein Beispiel für undefiniertes Verhalten, denke ich. Das Buch, das ich gerade lese, sagt "undefiniertes Verhalten". –
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. –