Ja, wie alle anderen auch sagen. C++ spezifiziert/mandatiert dies.
Aber nur, dass für Vollständigkeit hinzuzufügen: Wenn Ihr goto
die computed- goto
Erweiterung in einigen Compilern gefunden verwendet - gcc, Klirren, möglicherweise andere, aber nicht einschließlich MSVC zuletzt wusste ich - ob die Der Destruktor des Objekts, der aufgerufen wird, ist ziemlich verschwommen. Wenn ein goto
an einen einzigen Ort geht, ist es sehr klar, welche Destruktoren vor der Kontrollflussübertragung aufgerufen werden müssen. Aber mit einer berechneten goto
, verschiedene Destruktoren müssen möglicherweise dynamisch aufgerufen werden, um die "erwartete" Semantik zu geben. Ich bin nicht sicher, welche Compiler, die diese Erweiterung implementieren, in diesen Fällen tun. Meine Erinnerung daran ist, dass der Clam warnt, wenn ein Computer einen Bereich mit einem Objekt mit einem Nicht-Trial-Destruktor belässt und behauptet, dass der Destruktor nicht aufgerufen wird. In einigen Fällen ist das in Ordnung, in anderen nicht. Ich weiß nicht, was andere Compiler tun. Seien Sie sich des Problems nur bewusst, wenn Sie berechnete goto
s zusammen mit Objekten mit nicht-trivialen Destruktoren verwenden möchten.
Warum müssen Sie das wissen? 'goto' macht im generierten Code Sinn, aber dort können und sollten Sie Objekte mit Destruktoren sowieso vermeiden. – MSalters
@MSalters: Das macht überhaupt keinen Sinn, warum sollten Sie Objekte mit Destruktoren vermeiden? –
@Viktor: Lassen Sie mich den zweiten Teil des Satzes erweitern: _In generated code_, können und sollten Sie Objekte mit Destruktoren sowieso vermeiden. Die kanonische Verwendung von 'goto' ist im generierten FSM-Code. Hier finden Sprünge rückwärts und vorwärts statt, ohne Rücksicht auf Zustandscodezustände, die gerade in der Mitte liegen. FSM-Zustände sind einfach nicht linear, aber C++ Code muss sein. – MSalters