Spec-Zone.ru › C++

noexcept оператор (начиная с C++11)

Оператор noexcept выполняет проверку во время компиляции и возвращает true, если объявлено, что выражение не генерирует исключений.

Его можно использовать в спецификаторе noexcept шаблона функции, чтобы объявить, что функция будет генерировать исключения для одних типов, но не для других.

Синтаксис

noexcept( expression )

Возвращает prvalue типа bool. Результат равен true, если множество потенциальных исключений выражения пусто(до C++17)для выражения задано свойство не генерировать исключения(начиная с C++17), а в противном случае false.

expression является невычисляемым операндом.

Если expression является prvalue, применяется материализация временного объекта.

(начиная с C++17)

Примечания

Даже если noexcept(expr) равен true, вычисление expr всё же может привести к генерации исключения вследствие возникновения неопределённого поведения.

Если expression имеет тип класса или является массивом (возможно, многомерным) такого типа, материализация временного объекта требует, чтобы деструктор не был удалён и был доступен.

(начиная с 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"
        // note: the following tests also require that ~T() is noexcept because
        // the expression within noexcept constructs and destroys a temporary
        "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 Применён к Опубликованное поведение Корректное поведение
CWG 2722 C++17 не было ясно, применяется ли материализация временного объекта,
если expression является prvalue
в этом случае
она применяется
CWG 2792 C++11 оператор noexcept должен был определять, могут ли генерироваться исключения
при возникновении неопределённого поведения
не требуется

См. также

noexcept спецификатор(C++11) указывает, может ли функция генерировать исключения
Динамическая спецификация исключений(до C++17) указывает, какие исключения генерируются функцией (устарело в C++11)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/noexcept

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API