Оператор noexcept
Оператор noexcept в C++ выполняет две роли. Во-первых, он является спецификатором исключений и указывается после списка параметров функции, чтобы сообщить компилятору и программисту, что функция не выбрасывает исключений. Во-вторых, noexcept может использоваться как унарный оператор, который принимает выражение и возвращает true, если выражение гарантированно не выбрасывает исключений, и false в противном случае. Спецификатор может принимать константное выражение, например noexcept(true) или noexcept(false), а также условную форму noexcept(выражение).
Синтаксис
// спецификатор исключения
return_type function_name(params) noexcept;
return_type function_name(params) noexcept(expression);
// оператор проверки
noexcept(expression)
Пример
Объявим функцию, которая не выбрасывает исключений, и проверим это с помощью оператора noexcept:
#include <iostream>
using namespace std;
void func() noexcept
{
cout << "noexcept function" << endl;
}
void func2()
{
cout << "normal function" << endl;
}
int main()
{
cout << noexcept(func()) << endl;
cout << noexcept(func2()) << endl;
return 0;
}
Результат выполнения кода:
1
0
Пример
Используем условный спецификатор noexcept, который зависит от шаблонного параметра:
#include <iostream>
using namespace std;
template <typename T>
void process(T value) noexcept(noexcept(T()))
{
T temp;
cout << "processed" << endl;
}
int main()
{
cout << noexcept(process(1)) << endl;
cout << noexcept(process("abcde")) << endl;
return 0;
}
Результат выполнения кода:
1
1
Пример
Проверим, может ли операция присваивания выбрасывать исключение:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a = 1;
int b = 2;
string s1 = "abcde";
string s2 = "12345";
cout << noexcept(a = b) << endl;
cout << noexcept(s1 = s2) << endl;
return 0;
}
Результат выполнения кода:
1
1
Смотрите также
-
оператор
constexpr,
который вычисляет значение на этапе компиляции -
оператор
consteval,
который требует вычисления на этапе компиляции -
оператор
static_assert,
который проверяет условие на этапе компиляции -
оператор
decltype,
который определяет тип выражения