noexcept
operator(since C++11)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 | ||||||||||||||||
| ||||||||||||||||
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 | ||||||||||||||||
General | ||||
Literals | ||||
Operators | ||||
Conversions | ||||
try block | ||||
Throwing exceptions | ||||
Handling exceptions | ||||
Exception specification | ||||
noexcept specification(C++11) | ||||
dynamic specification(until C++17*) | ||||
noexcept operator(C++11) |
Thenoexcept operator performs a compile-time check that returnstrue if an expression is declared to not throw any exceptions.
It can be used within a function template'snoexcept specifier to declare that the function will throw exceptions for some types but not others.
Contents |
noexcept( expression) | |||||||||
Returns aprvalue of typebool. The result istrue ifthe set ofpotential exceptions of theexpression is empty(until C++17)expression is specified to benon-throwing(since C++17), andfalse otherwise.
expression is anunevaluated operand.
Ifexpression is a prvalue,temporary materialization is applied. | (since C++17) |
Even ifnoexcept(expr) istrue, an evaluation ofexpr may still throw as the result of encountering undefined behavior.
Ifexpression is of a class type or (possibly multidimensional) array thereof, temporary materialization requires the destructor be non-deleted and accessible. | (since C++17) |
#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";}
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)
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 materialization is applied ifexpression is a prvalue | it is applied in this case |
CWG 2792 | C++11 | thenoexcept operator was required to determine whether exceptions may be thrown in the case of encountering undefined behavior | not required |
noexcept specifier(C++11) | specifies whether a function could throw exceptions[edit] |
Dynamic exception specification(until C++17) | specifies what exceptions are thrown by a function(deprecated in C++11)[edit] |