Namespaces
Variants

noexcept operator (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

noexcept

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)