noexcept
(C++)
C++11 : spécifie si une fonction peut lever des exceptions.
Syntaxe
noexcept-specifier
:
noexcept
noexcept-expression
throw
(
)
noexcept-expression
:
noexcept
(
constant-expression
)
Paramètres
constant-expression
Expression constante de type bool
, qui indique si l’ensemble des types d’exceptions potentiels est vide. La version inconditionnelle équivaut à noexcept(true)
.
Notes
noexcept-expression
est un genre de spécification d’exception : il s’agit d’un suffixe d’une déclaration de fonction, qui représente un ensemble de types pouvant être mis en correspondance par un gestionnaire d’exceptions pour toute exception qui quitte une fonction. L’opérateur conditionnel unaire noexcept(constant_expression)
quand constant_expression
retourne true
, et son synonyme inconditionnel noexcept
, spécifient que l’ensemble des types d’exceptions potentiels qui peuvent quitter une fonction est vide. En d’autres termes, la fonction ne lève jamais d’exception, et ne permet jamais la propagation d’une exception en dehors de son étendue. L’opérateur noexcept(constant_expression)
quand constant_expression
retourne false
, ou l’absence de spécification d’exception (autre que pour un destructeur ou une fonction de désallocation), indique que l’ensemble des exceptions potentielles qui peuvent quitter la fonction correspond à l’ensemble de tous les types.
Marquez une fonction comme étant noexcept
uniquement si toutes les fonctions qu’elle appelle, directement ou indirectement, sont également noexcept
ou const
. Le compilateur ne vérifie pas nécessairement chaque chemin du code à la recherche d’exceptions qui peuvent remonter jusqu’à une fonction noexcept
. Si une exception sort de l’étendue externe d’une fonction marquée noexcept
, std::terminate
est appelé immédiatement, et rien ne garantit l’appel des destructeurs des objets de l’étendue. Utilisez noexcept
à la place du spécificateur d’exception dynamique throw()
. La spécification d’exception dynamique, ou spécification throw(optional_type_list)
, est déconseillé en C++11, et a été supprimée en C++17, à l’exception de throw()
, qui est un alias de noexcept(true)
. Nous vous recommandons d’appliquer noexcept
aux fonctions qui ne permettent jamais à une exception de se propager vers le haut de la pile des appels. Quand une fonction est déclarée noexcept
, cela permet au compilateur de générer un code plus efficace dans plusieurs contextes différents. Pour plus d’informations, consultez Spécifications des exceptions.
Exemple
Un modèle de fonction qui copie son argument peut être déclaré noexcept
à condition que l’objet copié soit un ancien type de données (POD) en clair. Cette fonction peut être déclarée comme suit :
#include <type_traits>
template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
// ...
}
Voir aussi
Meilleures pratiques C++ modernes pour la gestion des exceptions et des erreurs
Spécifications des exceptions (throw
, noexcept
)
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour