C'est un peu compliqué. À propos de la validité de longjmp
, le standard dit:
Une paire d'appels setjmp/longjmp a un comportement indéfini si le remplacement de setjmp et longjmp par catch et throw invoquerait des destructeurs non triviaux pour des objets avec une durée de stockage automatique.
runtime_error
a un destructeur non trivial, donc la question est de savoir si l'objet exception a une "durée de stockage automatique". Ce n'est pas le cas. Cela suggère que longjmp
devrait fonctionner correctement.
De plus, la destruction de l'objet exception peut se produire à l'un de deux endroits:
Les points de destruction potentiels pour l'objet exception sont:
-
lorsqu'un gestionnaire actif pour l'exception se termine de toute autre manière que par un rethrow, immédiatement après la destruction de l'objet (le cas échéant) déclaré dans la déclaration d'exception dans le gestionnaire;
-
lorsqu'un objet de type std::exception_ptr qui fait référence à l'objet exception est détruit, avant que le destructeur de std::exception_ptr ne retourne.
longjmp
n'est pas un "rethrow". Donc en théorie, cela devrait fonctionner grâce au point 1.
Cela étant dit, ne jamais se fier à cela. Je doute fortement que les implémentations de longjmp
gèrent correctement cela, et même si certaines le font, ce n'est probablement pas quelque chose que vous pouvez attendre.