Namespaces
Variants

noexcept operator (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Оператор 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)

Ключевые слова

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 <<
        "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)