Спецификация noexcept
Спецификация noexcept сообщает компилятору,
что функция или метод не выбрасывает исключений.
Это позволяет компилятору применять более эффективные
оптимизации и влияет на выбор перегрузок в шаблонах.
Существует две формы записи: noexcept без
параметров и noexcept(выражение), где выражение
приводится к типу bool. Если функция помечена
как noexcept, но внутри неё всё же возникает
исключение, вызывается функция std::terminate,
и программа аварийно завершается.
Синтаксис
// Простая форма
return_type function_name(params) noexcept;
// Условная форма
return_type function_name(params) noexcept(expression);
// Для методов класса
class MyClass {
public:
void method() noexcept;
};
Пример
Давайте объявим функцию, которая гарантированно не выбрасывает исключений:
#include <iostream>
using namespace std;
int safeDivide(int a, int b) noexcept
{
if (b == 0) {
return 0;
}
return a / b;
}
int main()
{
cout << safeDivide(10, 2) << endl;
cout << safeDivide(10, 0) << endl;
return 0;
}
Результат выполнения кода:
5
0
Пример
Давайте проверим с помощью оператора noexcept,
выбрасывает ли функция исключения. Оператор возвращает
true, если функция помечена как noexcept:
#include <iostream>
using namespace std;
void func1() noexcept
{
}
void func2()
{
}
int main()
{
cout << noexcept(func1()) << 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(value)))
{
T res = value;
cout << res << endl;
}
int main()
{
process(42);
process("abcde");
return 0;
}
Результат выполнения кода:
42
"abcde"