Что делает спецификация noexcept? Я думал, что она не позволит функции кинуть исключение, но это не так, функция:
int Foo() noexcept
{
throw std::runtime_error("error");
return 0;
}
компилируется, её вызов спокойно падает, значит исключение вылетело. noexcept ничего не изменил.
Спецификатор noexcept
дает гарантию времени компиляции, что из функции не будет выброшено исключение. Однако такая гарантия достигается эквивалентно оборачиванию тела функции в блок try...catch с вызовом ::std::terminate
:
int Foo() noexcept
{
try
{
throw std::runtime_error("error");
}
catch(...)
{
::std::terminate();
}
}
Определить, что в теле функции исключений действительно не выбрасывается и соптимизировать их перехват компиляторы могут только в самых простых случаях. Идея была в том, что оптимизацию сможет осуществить вызывающий код. Но на практике это все не работает и контроля над исключениями во время компиляции, особенно после выкидывания спецификаторов исключений, в с++ фактически нет.
Этим вы как автор гарантируете, что ваша функция не генерирует исключений, так что компилятор может, полагаясь на это, выполнять ряд оптимизаций.
Понятно, что вы хозяин своему слову - сам дал, сам и назад забрал! Только потом не удивляйтесь результатам - завершению программы.
См., например, эту статейку.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Отправляю запрос, в переменной data содержится результат вызова метода photossaveWallPhoto, ошибок нет