2008-12-02 18 views
16

Ce code conduit à un comportement non défini:Les goto et les destructeurs sont-ils compatibles?


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

Le constructeur n'est pas appelé.

Mais qu'en est-il de ce code? Le destructeur de x sera-t-il appelé? Je pense que ce sera, mais je veux être sûr. :)


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

Le premier exemple de code ne conduit pas à un comportement indéfini, il est illégal et ne sera pas compilé. –

+0

"ne compilera pas" est un exemple de comportement indéfini, je pense. Le livre que je suis en train de lire dit "comportement indéfini". –

+2

Les deux sont techniquement différents: si le compilateur doit rejeter le programme, c'est "moins mauvais" du point de vue du programmeur que quelque chose qui pourrait compiler et mettre sa maison en feu quand il s'exécute. Certains compilateurs rejettent des choses qui sont légales mais que ce compilateur sait être indéfinies. –

Répondre

42

Oui, les destructeurs seront appelés comme prévu, de la même manière que si vous aviez quitté la portée plus tôt en raison d'une exception.

standard 6,6/2 (états de saut):

A la sortie de la portée (cependant accompli), les destructeurs sont appelés pour tous les objets construits avec la durée de stockage automatique qui sont déclarées en ce que la portée, dans l'ordre inverse de leur déclaration.

+0

Vous avez un devis? –