Поделиться через


noexcept (C++)

C++11. Указывает, может ли функция вызывать исключения.

Синтаксис

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

Параметры

constant-expression
Константное выражение типа bool , представляющее, является ли набор потенциальных типов исключений пустым. Безусловная версия эквивалентна noexcept(true).

Замечания

Это noexcept-expression тип спецификации исключения: суффикс в объявление функции, представляющее набор типов, которые могут соответствовать обработчику исключений для любого исключения, выходя из функции. Унарный условный оператор noexcept(constant_expression) при constant_expression получении trueи его безусловный синоним noexceptуказывают, что набор потенциальных типов исключений, которые могут выйти из функции, пуста. То есть функция никогда не создает исключение и никогда не позволяет распространять исключение за пределы своей области. Оператор noexcept(constant_expression) при constant_expression получении falseили отсутствии спецификации исключения (кроме функции деструктора или сделки), указывает, что набор потенциальных исключений, которые могут выйти из функции, является набором всех типов.

Помечайте функцию noexcept только в том случае, если все функции, которые он вызывает, напрямую или косвенно, также noexcept или const. Компилятор не обязательно проверяет каждый путь кода для исключений noexcept , которые могут пузыриться до функции. Если исключение выходит из внешней области функции, помеченной noexceptнемедленно, std::terminate вызывается немедленно и не гарантирует, что деструкторы любых объектов в области будут вызваны. Используйте noexcept вместо описателя throw()динамических исключений. Спецификация динамического исключения или throw(optional_type_list) спецификация устарела в C++11 и удалена в C++17, за исключением throw()псевдонима noexcept(true). Мы рекомендуем применить noexcept к любой функции, которая никогда не позволяет исключениям распространяться по стеку вызовов. При объявлении noexceptфункции компилятор позволяет создавать более эффективный код в нескольких разных контекстах. Дополнительные сведения см . в спецификациях исключений.

Пример

Шаблон функции, копирующий его аргумент, может быть объявлен noexcept в том условии, что копируемый объект является обычным старым типом данных (POD). Такая функция может быть объявлена следующим образом:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
   // ...
}

См. также

Современные рекомендации по C++ по исключению и обработке ошибок
Спецификации исключений (throw, noexcept)