Spec-Zone.ru › C++

Оператор noexcept (с C++11)

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

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

Синтаксис

noexcept( выражение )

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

выражение — это неоцениваемый операнд.

Если выражение — это prvalue, формально применяется создание временного объекта. В частности, деструктор должен быть не удаленным и доступным, если такое выражение является типом класса или (возможно, многомерным) массивом.

(с 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 не было ясно, применяется ли создание временного объекта
если выражение — prvalue
применяется
в этом случае

См. также

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

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

Spec-Zone.ru

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