Partager via


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)