noexcept operator
除运算符%28外,自C++11%29
大noexcept
运算符执行编译时检查,如果声明表达式不引发任何异常,则返回true。
它可以在函数模板%27中使用。除说明符声明该函数将对某些类型抛出异常,但不抛出其他类型的异常。
句法
noexcept( expression ) | | |
---|
返回prvalue类型bool
...
解释
大noexcept
运算符不计算表达式。
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. | (until C++17) |
---|---|
The result is true if the set of potential exceptions of the expression is empty, and false otherwise. | (since C++17) |
- 调用不具有非引发异常规范的任何类型的函数,除非它是常数表达式...
throw
表达...
dynamic_cast
表达当目标类型是引用类型时,转换需要运行时检查。
typeid
表达当参数类型是多态类类型时
在所有其他情况下,结果是true
...
%28直到C++17%29,结果是true
如果潜在例外
的表达式是空的,并且false
否则。
%28自C++17%29
关键词
noexcept
...
例
二次
#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
<< "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'
// note: the following tests also require that ~T() is noexcept because
// the expression within noexcept constructs and destroys a temporary
<< "Is T(rvalue T) noexcept? " << noexcept(T(std::declval<T>())) << '\n'
<< "Is T(lvalue T) noexcept? " << noexcept(T(t)) << '\n'
<< "Is U(rvalue U) noexcept? " << noexcept(U(std::declval<U>())) << '\n'
<< "Is U(lvalue U) noexcept? " << noexcept(U(u)) << '\n'
<< "Is V(rvalue V) noexcept? " << noexcept(V(std::declval<V>())) << '\n'
<< "Is V(lvalue V) noexcept? " << noexcept(V(v)) << '\n';
}
二次
产出:
二次
Is may_throw() noexcept? false
Is no_throw() noexcept? true
Is lmay_throw() noexcept? false
Is lno_throw() noexcept? true
Is ~T() noexcept? true
Is T(rvalue T) noexcept? true
Is T(lvalue T) noexcept? true
Is U(rvalue U) noexcept? false
Is U(lvalue U) noexcept? false
Is V(rvalue V) noexcept? true
Is V(lvalue V) noexcept? false
二次
另见
noexcept specifier | requires a function to not throw any exceptions (C++11) |
---|---|
exception specification | specifies what exceptions are thrown by a function (deprecated) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。