Difference between revisions of "cpp/language/noexcept"
From cppreference.com
(this way its more interesting) |
(or better like that) |
||
Line 46: | Line 46: | ||
class U{ | class U{ | ||
public: | public: | ||
+ | ~U(){} | ||
std::vector<int> v; | std::vector<int> v; | ||
}; | }; | ||
− | + | class V{ | |
+ | public: | ||
+ | std::vector<int> v; | ||
+ | }; | ||
+ | |||
int main() | int main() | ||
{ | { | ||
T t; | T t; | ||
U u; | U u; | ||
+ | V v; | ||
std::cout << std::boolalpha | std::cout << std::boolalpha | ||
Line 63: | Line 69: | ||
<< "Is T(T&) noexcept? " << noexcept(T(t)) << '\n' | << "Is T(T&) noexcept? " << noexcept(T(t)) << '\n' | ||
<< "Is U(U&&) noexcept? " << noexcept(U(std::declval<U>())) << '\n' | << "Is U(U&&) noexcept? " << noexcept(U(std::declval<U>())) << '\n' | ||
− | << "Is U(U&) noexcept? " << noexcept(U(u)) << '\n'; | + | << "Is U(U&) noexcept? " << noexcept(U(u)) << '\n' |
+ | << "Is V(V&&) noexcept? " << noexcept(V(std::declval<V>())) << '\n' | ||
+ | << "Is V(V&) noexcept? " << noexcept(V(v)) << '\n'; | ||
} | } | ||
}} | }} |
Revision as of 08:25, 20 April 2014
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.
Contents |
Syntax
noexcept( expression )
|
|||||||||
Returns a prvalue of type bool.
Explanation
The noexcept
operator does not evaluate expression. The result is false
if the expression contains at least one of the following potentially evaluated constructs:
- call to any type of function that does not have non-throwing exception specification, unless it is a constant expression.
-
throw
expression. -
dynamic_cast
expression when the target type is a reference type, and conversion needs a run time check -
typeid
expression when argument type is polymorphic class type
In all other cases the result is true
.
Keywords
Example
Run this code
#include <iostream> #include <utility> #include <vector> void may_throw(); void no_throw() noexcept; auto lmay_throw = []{}; auto lno_throw = []() noexcept {}; class T{ public: ~T(){} }; class U{ public: ~U(){} std::vector<int> v; }; class V{ public: std::vector<int> v; }; int main() { T t; U u; V v; std::cout << std::boolalpha << "Is may_throw() noexcept? " << noexcept(may_throw()) << '\n' << "Is no_throw() noexcept? " << noexcept(no_throw()) << '\n' << "Is lmay_throw() noexcept? " << noexcept(lmay_throw()) << '\n' << "Is lno_throw() noexcept? " << noexcept(lno_throw()) << '\n' << "Is ~T() noexcept? " << noexcept(std::declval<T>().~T()) << '\n' << "Is T(T&&) noexcept? " << noexcept(T(std::declval<T>())) << '\n' << "Is T(T&) noexcept? " << noexcept(T(t)) << '\n' << "Is U(U&&) noexcept? " << noexcept(U(std::declval<U>())) << '\n' << "Is U(U&) noexcept? " << noexcept(U(u)) << '\n' << "Is V(V&&) noexcept? " << noexcept(V(std::declval<V>())) << '\n' << "Is V(V&) noexcept? " << noexcept(V(v)) << '\n'; }
See also
noexcept specifier(C++11)
|
specifies whether a function could throw exceptions |
Dynamic exception specification(until C++17) | specifies what exceptions are thrown by a function (deprecated in C++11) |