Оператор noexcept (начиная с C++11)
Материал из cppreference.com
Оператор noexcept выполняет проверку во время компиляции, которая возвращает true, если объявлено выражение, не вызывающее никаких исключений.
Его можно использовать внутри спецификатора noexcept шаблона функции, чтобы объявить, что функция будет генерировать исключения для одних типов, но не для других.
Синтаксис
noexcept( выражение )
|
|||||||||
Возвращает prvalue типа bool.
Объяснение
Оператор noexcept не оценивает выражение.
Результатом является true, если множество потенциальных исключений выражения пусто (до C++17)выражение является не генерирующим исключение (начиная с C++17), и false иначе.
Ключевые слова
Пример
Запустить этот код
#include <iostream>
#include <utility>
#include <vector>
void may_throw();
void no_throw() noexcept;
auto lmay_throw = []{};
auto lno_throw = []() noexcept {};
class T
{
public:
~T(){} // деструктор предотвращает конструктор перемещения
// конструктор копирования является noexcept
};
class U
{
public:
~U(){} // деструктор предотвращает конструктор перемещения
// конструктор копирования является 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() noexcept? " << noexcept(may_throw()) << '\n'
<< "Является ли no_throw() noexcept? " << noexcept(no_throw()) << '\n'
<< "Является ли lmay_throw() noexcept? " << noexcept(lmay_throw()) << '\n'
<< "Является ли lno_throw() noexcept? " << noexcept(lno_throw()) << '\n'
<< "Является ли ~T() noexcept? " << noexcept(std::declval<T>().~T()) << '\n'
// примечание: следующие тесты также требуют, чтобы ~T() был noexcept,
// потому что выражение внутри noexcept создаёт и уничтожает временный объект
<< "Является ли T(rvalue T) noexcept? " << noexcept(T(std::declval<T>())) << '\n'
<< "Является ли T(lvalue T) noexcept? " << noexcept(T(t)) << '\n'
<< "Является ли U(rvalue U) noexcept? " << noexcept(U(std::declval<U>())) << '\n'
<< "Является ли U(lvalue U) noexcept? " << noexcept(U(u)) << '\n'
<< "Является ли V(rvalue V) noexcept? " << noexcept(V(std::declval<V>())) << '\n'
<< "Является ли V(lvalue V) noexcept? " << noexcept(V(v)) << '\n';
}
Вывод:
Является ли may_throw() noexcept? false
Является ли no_throw() noexcept? true
Является ли lmay_throw() noexcept? false
Является ли lno_throw() noexcept? true
Является ли ~T() noexcept? true
Является ли T(rvalue T) noexcept? true
Является ли T(lvalue T) noexcept? true
Является ли U(rvalue U) noexcept? false
Является ли U(lvalue U) noexcept? false
Является ли V(rvalue V) noexcept? true
Является ли V(lvalue V) noexcept? false
Смотрите также
спецификатор noexcept(C++11)
|
указывает, может ли функция генерировать исключения |
| Спецификация динамического исключения(до C++17) | указывает, какие исключения вызываются функцией (устарело в C++11) |