noexcept
operator
(since C++11)
L'opérateur noexcept effectue une vérification à la compilation qui retourne true si une expression est déclarée comme ne levant aucune exception.
Il peut être utilisé dans la spécification noexcept specifier d'un modèle de fonction pour déclarer que la fonction lancera des exceptions pour certains types mais pas pour d'autres.
Table des matières |
Syntaxe
noexcept(
expression
)
|
|||||||||
Retourne une prvalue de type bool . Le résultat est true si l'ensemble des exceptions potentielles de l' expression est vide (jusqu'en C++17) l' expression est spécifiée comme étant non-lancante (depuis C++17) , et false sinon.
expression est un opérande non évalué .
|
Si expression est une prvalue, la matérialisation temporaire est appliquée. |
(depuis C++17) |
Notes
Même si noexcept ( expr ) est true , une évaluation de expr peut toujours lever une exception suite à un comportement indéfini.
|
Si expression est d'un type classe ou d'un tableau (éventuellement multidimensionnel) de celui-ci, la matérialisation temporaire exige que le destructeur ne soit pas supprimé et soit accessible. |
(since C++17) |
Mots-clés
Exemple
#include <iostream> #include <utility> #include <vector> void may_throw(); void no_throw() noexcept; auto lmay_throw = []{}; auto lno_throw = []() noexcept {}; class T { public: ~T(){} // dtor prevents move ctor // copy ctor is noexcept }; class U { public: ~U(){} // dtor prevents move ctor // copy ctor is noexcept(false) std::vector<int> v; }; class V { public: std::vector<int> v; }; int main() { T t; U u; V v; std::cout << std::boolalpha << "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n" "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n" "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n" "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n" "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n" // note: the following tests also require that ~T() is noexcept because // the expression within noexcept constructs and destroys a temporary "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n" "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n" "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n" "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n" "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n" "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n"; }
Sortie :
may_throw() is noexcept(false) no_throw() is noexcept(true) lmay_throw() is noexcept(false) lno_throw() is noexcept(true) ~T() is noexcept(true) T(rvalue T) is noexcept(true) T(lvalue T) is noexcept(true) U(rvalue U) is noexcept(false) U(lvalue U) is noexcept(false) V(rvalue V) is noexcept(true) V(lvalue V) is noexcept(false)
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| CWG 2722 | C++17 |
il n'était pas clair si la matérialisation temporaire
est appliquée si expression est une prvalue |
elle est appliquée
dans ce cas |
| CWG 2792 | C++11 |
l'opérateur
noexcept
devait déterminer si des exceptions
peuvent être levées dans le cas d'un comportement indéfini |
non requis |
Voir aussi
noexcept
spécificateur
(C++11)
|
spécifie si une fonction peut lever des exceptions |
| Spécification d'exception dynamique (jusqu'à C++17) | spécifie quelles exceptions sont levées par une fonction (obsolète en C++11) |