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 de types d’exceptions potentiels est vide. La version inconditionnelle est équivalente à noexcept(true).

Notes

Il noexcept-expression s’agit d’un type de spécification d’exception : suffixe à 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. Lorsque l’opérateur noexcept(constant_expression) conditionnel unaire génère constant_expressiontrueet son synonyme noexceptinconditionnel, spécifiez que l’ensemble de types d’exceptions potentiels pouvant quitter une fonction est vide. Autrement dit, la fonction ne lève jamais d’exception et n’autorise jamais la propagation d’une exception en dehors de son étendue. L’opérateur noexcept(constant_expression) qui constant_expression génère false, ou l’absence d’une spécification d’exception (autre que pour une fonction de destructeur ou de désallocation), indique que l’ensemble d’exceptions potentielles qui peuvent quitter la fonction est l’ensemble de tous les types.

Marquez une fonction comme noexcept uniquement si toutes les fonctions qu’il appelle, directement ou indirectement, sont également noexcept ou const. Le compilateur n’case activée pas nécessairement chaque chemin d’accès de code pour les exceptions susceptibles de buller vers une noexcept fonction. Si une exception quitte l’étendue externe d’une fonction marquée noexcept, std::terminate est appelée immédiatement et qu’il n’existe aucune garantie que les destructeurs d’objets dans l’étendue seront appelés. Utilisez noexcept plutôt que le spécificateur throw()d’exception dynamique . La spécification d’exception dynamique, ou throw(optional_type_list) spécification, a été déconseillée en C++11 et supprimée en C++17, à l’exception de , qui throw()est un alias pour noexcept(true). Nous vous recommandons d’appliquer noexcept à n’importe quelle fonction qui n’autorise jamais une exception à propager la pile des appels. Lorsqu’une fonction est déclarée noexcept, elle permet au compilateur de générer du code plus efficace dans plusieurs contextes différents. Pour plus d’informations, consultez spécifications d’exception.

Exemple

Un modèle de fonction qui copie son argument peut être déclaré noexcept à la condition que l’objet copié soit un type de données ancien brut (POD). 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 d’exception (throw, noexcept)