Tak, jak mówią wszyscy inni. C++ określa/nakazuje to.
Ale tylko dodać do tego, dla kompletności: jeśli goto
używa computed- goto
rozszerzenie znaleźć w niektórych kompilatory - gcc, szczęk, być może inne, ale nie tym MSVC ostatni Wiedziałem - czy destruktor obiektu zostanie nazwany jest dość mglisty. Kiedy goto
idzie do pojedynczej lokalizacji, jest bardzo jasne, jakie destruktory muszą zostać wywołane przed transferem sterowania. Ale z obliczonym goto
, różne destruktory mogą wymagać dynamicznego wywołania, aby dać "oczekiwaną" semantykę. Nie jestem pewien, jakie kompilatory, które implementują to rozszerzenie, w tych przypadkach. Moją pamięcią jest to, że klang ostrzega, gdy obliczony obiekt może pozostawić zakres z obiektem z nie-triwalnym destruktorem, twierdząc, że destruktor nie zostanie wywołany. W niektórych przypadkach może być dobrze, w innych nie. Nie wiem od ręki, co robią inne kompilatory. Po prostu pamiętaj o problemie, jeśli chcesz używać obliczonych goto
s w porozumieniu z obiektami z nietrywialnymi destruktorami.
Dlaczego musisz to wiedzieć? 'goto' ma sens w wygenerowanym kodzie, ale i tak można i należy unikać obiektów z destruktorami. – MSalters
@MSalters: to nie robi żadnego sensu, dlaczego powinieneś unikać obiektów z destruktorami? –
@Viktor: Pozwól mi rozwinąć drugą część zdania: _W wygenerowanym kodzie, możesz i powinieneś unikać obiektów z destruktorami. Kanoniczne użycie 'goto' jest w wygenerowanym kodzie FSM. Tutaj skoki występują w tył i w przód, bez względu na stany kodów stanów, które akurat znajdują się w środku. Stany FSM po prostu nie są liniowe, ale musi to być kod C++. – MSalters