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] |