noexcept
operator
(since C++11)
Оператор noexcept выполняет проверку во время компиляции, которая возвращает true если выражение объявлено как не выбрасывающее исключения.
Он может использоваться в спецификаторе noexcept specifier шаблона функции для объявления, что функция будет выбрасывать исключения для одних типов, но не для других.
Содержание |
Синтаксис
noexcept(
выражение
)
|
|||||||||
Возвращает prvalue типа bool . Результат равен true , если множество потенциальных исключений для выражения пусто (до C++17) выражение объявлено как не генерирующее исключения (начиная с C++17) , и false в противном случае.
expression является невычисляемым операндом .
|
Если expression является prvalue, применяется материализация временного объекта . |
(since C++17) |
Примечания
Даже если noexcept ( expr ) возвращает true , вычисление expr всё равно может вызвать исключение в результате возникновения неопределённого поведения.
|
Если expression имеет тип класса или (возможно многомерный) массив таких типов, материализация временного объекта требует, чтобы деструктор был неудалённым и доступным. |
(since C++17) |
Ключевые слова
Пример
#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 << "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n" "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n" "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n" "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n" "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n" // примечание: следующие тесты также требуют, чтобы ~T() был noexcept, потому что // выражение внутри noexcept создает и уничтожает временный объект "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n" "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n" "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n" "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n" "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n" "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n"; }
Вывод:
may_throw() is noexcept(false) no_throw() is noexcept(true) lmay_throw() is noexcept(false) lno_throw() is noexcept(true) ~T() is noexcept(true) T(rvalue T) is noexcept(true) T(lvalue T) is noexcept(true) U(rvalue U) is noexcept(false) U(lvalue U) is noexcept(false) V(rvalue V) is noexcept(true) V(lvalue V) is noexcept(false)
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 2722 | C++17 |
было неясно, применяется ли материализация временного объекта
если expression является prvalue |
применяется
в этом случае |
| CWG 2792 | C++11 |
оператор
noexcept
требовал определения, могут ли исключения
быть выброшены в случае встречи с неопределенным поведением |
не требуется |
Смотрите также
noexcept
спецификатор
(C++11)
|
определяет, может ли функция генерировать исключения |
| Динамическая спецификация исключений (до C++17) | определяет, какие исключения генерируются функцией (устарело в C++11) |