Оператор noexcept (начиная с C++11) — cppreference.com
Материал из 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