2008-12-02 10 views
16

Este código da lugar a un comportamiento indefinido:¿Son compatibles los goto y los destructores?


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

El constructor no se llama.

Pero, ¿qué pasa con este código? Se llamará al destructor de x? Creo que será, pero quiero estar seguro. :)


void some_func() { 
    { 
    T x = T(); 
    goto out; 
    } 
    out: 
} 
+0

El primer ejemplo de código no da lugar a un comportamiento indefinido, es ilegal y no se compilará. –

+0

"no compilará" es un ejemplo de comportamiento indefinido, creo. El libro que estoy leyendo ahora dice "comportamiento indefinido". –

+2

Los dos son técnicamente diferentes: si se requiere que el compilador rechace el programa, eso es "menos malo" del punto de vista del programador que algo que podría compilar y prender fuego a su casa cuando se ejecuta. Algunos compiladores rechazan cosas que son legales pero que el compilador sabe que no estarán definidas. –

Respuesta

42

Sí, los destructores se ejecutarán como se esperaba, lo mismo que si saliera del alcance antes de tiempo debido a una excepción.

(declaraciones salto) 6.6/2 estándar:

Al salir del ámbito de aplicación (sin embargo logrado), destructores se llaman para todos los objetos construidos con una duración de almacenamiento automático que se declaran en ese ámbito, en el orden inverso de su declaración.

+0

¿Tiene una cita del estándar sobre eso? –

Cuestiones relacionadas