noexcept specifier (since C++11)
Specifies whether a function will throw exceptions or not.
Contents |
[edit] Syntax
noexcept
|
(1) | ||||||||
noexcept( expression)
|
(2) | ||||||||
[edit] Explanation
If the value of the constant expression is true, the function is declared to not throw any exceptions. noexcept
without a constant expression is equivalent to noexcept(
true)
.
One of the uses of the constant expression is (along with the noexcept
operator) to define templated functions that declare noexcept
for some types but not others.
Note that a noexcept
specification on a function is not a compile-time check; it is merely a method for a programmer to inform the compiler whether or not a function should throw exceptions. The compiler can use this information to enable certain optimizations on non-throwing functions as well as enable the noexcept
operator, which can check at compile time if a particular expression is declared to throw any exceptions. For example, containers such as std::vector will move their elements if the elements' move constructor is noexcept
, and copy otherwise.
If a function marked noexcept
allows an uncaught exception to escape at runtime, std::terminate is called immediately.
[edit] Deprecates
noexcept
is an improved version of throw(), which is deprecated in C++11. Unlike throw(), noexcept
will not call std::unexpected and may or may not unwind the stack, which potentially allows the compiler to implement noexcept
without the runtime overhead of throw().
[edit] Keywords
[edit] Example
// whether foo is declared noexcept depends on if the expression // T() will throw any exceptions template <class T> void foo() noexcept(noexcept(T())) {} void bar() noexcept(true) {} void baz() noexcept { throw 42; } // noexcept is the same as noexcept(true) int main() { foo<int>(); // noexcept(noexcept(int())) => noexcept(true), so this is fine bar(); // fine baz(); // compiles, but at runtime this calls std::terminate }
[edit] See also
noexcept operator | determines if an expression throws any exceptions (since C++11) |
exception specification | specifies what exceptions are thrown by a function (deprecated) |
throw expression | signals an error and transfers control to error handler |
(C++11)
|
obtains an rvalue reference if the move constructor does not throw (function template) |