From cppreference.com
The noexcept operator performs a compile-time check that returns true if an expression is declared to not throw any exceptions.
It can be used within a function template's
to declare that the function will throw exceptions for some types but not others.
Syntax
noexcept(expression)Returns a
of type bool. The result is true if the set of
of the expression is empty(until C++17)expression is specified to be
(since C++17), and false otherwise.
expression is an
.
Notes
Even if noexcept(expr) is true, an evaluation of expr may still throw as the result of encountering undefined behavior.
If expression is of a class type or (possibly multidimensional) array thereof, temporary materialization requires the destructor be non-deleted and accessible.
(since C++17)Keywords
Example
Run this code
#include<iostream>#include<utility>#include<vector>voidmay_throw();voidno_throw()noexcept;autolmay_throw=[]{};autolno_throw=[]()noexcept{};classT{public:~T(){}// dtor prevents move ctor// copy ctor is noexcept};classU{public:~U(){}// dtor prevents move ctor// copy ctor is noexcept(false)std::vector<int>v;};classV{public:std::vector<int>v;};intmain(){Tt;Uu;Vv;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";}Output:
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) Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++17 it was unclear whether temporary materialization
is applied if expression is a prvalue it is applied
in this case
C++11 the noexcept operator was required to determine whether exceptions
may be thrown in the case of encountering undefined behavior not required See also