Oui, comme tout le monde le dit. C++ spécifie/impose ceci.
Mais pour ajouter à cela, pour être complet: si votre goto
utilise l'extension goto
computed- trouvé dans certains compilateurs - gcc, clang, peut-être d'autres, mais pas y compris MSVC dernier, je savais - que ce soit ou non destructeur de l'objet sera appelé est assez brumeux. Quand un goto
va à un seul endroit, il est très clair quels destructeurs doivent être appelés avant le transfert de contrôle-débit. Mais avec un goto
calculé, différents destructeurs peuvent être appelés dynamiquement, pour donner la sémantique "attendue". Je ne suis pas sûr de savoir ce que font les compilateurs qui implémentent cette extension, dans ces cas-là. Ma mémoire de rencontrer ceci est que clang avertit quand un goto
calculé pourrait laisser une portée avec un objet avec un destructeur non trival, affirmant que le destructeur ne sera pas appelé. Dans certains cas, cela pourrait être bien, dans d'autres pas. Je ne sais pas ce que font les autres compilateurs. Juste être au courant du problème si vous voulez utiliser goto
s de concert avec des objets avec des destructeurs non trivial.
Pourquoi avez-vous besoin de le savoir? 'goto' a du sens dans le code généré, mais là vous pouvez et devriez éviter les objets avec des destructeurs de toute façon. – MSalters
@MSalters: cela ne fait rien du tout, pourquoi devriez-vous éviter les objets avec des destructeurs? –
@Viktor: Permettez-moi de développer la deuxième partie de la phrase: _In code_ généré, vous pouvez et devriez éviter les objets avec des destructeurs de toute façon. L'utilisation canonique de 'goto' est dans le code FSM généré. Ici, les sauts se produisent en arrière et en avant, sans tenir compte des états de code d'état qui se trouvent juste au milieu. Les états FSM ne sont tout simplement pas linéaires, mais le code C++ doit l'être. – MSalters