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:
}
El primer ejemplo de código no da lugar a un comportamiento indefinido, es ilegal y no se compilará. –
"no compilará" es un ejemplo de comportamiento indefinido, creo. El libro que estoy leyendo ahora dice "comportamiento indefinido". –
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. –