La signature throw() ne veut pas dire qu'aucune exception ne sera pas levée dans la fonction, mais garanti qu'aucune exception ne sera émise par la fonction. En l'occurrence, std::terminate sera appelé si une exception tente de s'échapper de la fonction-qui-ne-peut-lever.
Ceci sert quand on écrit des fonction exception-safe. C'est une garantie qu'il faut fournir, par exemple, dans les fonctions utilisées par le destructeur virtuel d'une classe.
Je partage l'avis que le compilateur devrait râler sur ce cas précis, et honnêtement, avant d'écrire l'exemple, je pensais qu'il le fait. Mais ce n'est pas un problème du langage : c'est un problème du compilateur. Si ça se trouve, LLVM ou MSC++ émettent un warning, peut-être que GCC a une option pour ça qui n'est pas incluse avec -Wall.
[^] # Re: Y'a-t-il encore besoin de nouveaux langages "bas niveau"?
Posté par LupusMic (site web personnel, Mastodon) . En réponse à la dépêche Le langage D. Évalué à 3.
La signature throw() ne veut pas dire qu'aucune exception ne sera pas levée dans la fonction, mais garanti qu'aucune exception ne sera émise par la fonction. En l'occurrence, std::terminate sera appelé si une exception tente de s'échapper de la fonction-qui-ne-peut-lever.
Ceci sert quand on écrit des fonction exception-safe. C'est une garantie qu'il faut fournir, par exemple, dans les fonctions utilisées par le destructeur virtuel d'une classe.
Je partage l'avis que le compilateur devrait râler sur ce cas précis, et honnêtement, avant d'écrire l'exemple, je pensais qu'il le fait. Mais ce n'est pas un problème du langage : c'est un problème du compilateur. Si ça se trouve, LLVM ou MSC++ émettent un warning, peut-être que GCC a une option pour ça qui n'est pas incluse avec -Wall.