Une récente question (et surtout de ma réponse) m'a fait me demander:
En C++11 (et plus récentes normes), les destructeurs sont toujours implicitement noexcept
, sauf indication contraire (c'est à dire noexcept(false)
). Dans ce cas, ces destructeurs peuvent légalement se lancer des exceptions. (Notez que c'est encore vous devez vraiment savoir ce que vous faites cegenre de situation!)
Cependant, tous les surcharges de
std::unique_ptr<T>::reset()
sont déclarés d'être toujours noexcept
(voir cppreference), même si le destructeur s' T
n'est pas le cas, résultant en fin de programme si un destructeur, déclenche une exception lors de l' reset()
. Des choses semblables s'appliquent std::shared_ptr<T>::reset()
.
Pourquoi est - reset()
toujours noexcept, et pas conditionnellement noexcept?
Il devrait être possible de déclarer noexcept(noexcept(std::declval<T>().~T()))
ce qui le rend noexcept exactement si le destructeur de l' T
est noexcept. Ai-je raté quelque chose ici, ou est-ce un oubli dans la norme (car ce n'est certes un très académique de la situation)?