noexcept operator (since C++11) - cppreference.com (original) (raw)

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 noexcept specifier to declare that the function will throw exceptions for some types but not others.

[edit] Syntax

| | | | | ------------------------------ | | | | noexcept( expression ) | | | | | | |

Returns a prvalue of type bool. The result is true if the set of potential exceptions of the expression is empty(until C++17)expression is specified to be non-throwing(since C++17), and false otherwise.

expression is an unevaluated operand.

[edit] 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)

[edit] Keywords

noexcept

[edit] Example

#include #include #include   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 v; };   class V { public: std::vector 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()) << ")\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())) << ")\n" "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n" "U(rvalue U) is noexcept(" << noexcept(U(std::declval())) << ")\n" "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n" "V(rvalue V) is noexcept(" << noexcept(V(std::declval())) << ")\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)

[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
CWG 2722 C++17 it was unclear whether temporary materializationis applied if expression is a prvalue it is appliedin this case
CWG 2792 C++11 the noexcept operator was required to determine whether exceptionsmay be thrown in the case of encountering undefined behavior not required

[edit] See also