Как работает noexcept в c++?

183
11 апреля 2018, 08:52

Что делает спецификация noexcept? Я думал, что она не позволит функции кинуть исключение, но это не так, функция:

int Foo() noexcept
{
    throw std::runtime_error("error");
    return 0;
}

компилируется, её вызов спокойно падает, значит исключение вылетело. noexcept ничего не изменил.

Answer 1

Спецификатор noexcept дает гарантию времени компиляции, что из функции не будет выброшено исключение. Однако такая гарантия достигается эквивалентно оборачиванию тела функции в блок try...catch с вызовом ::std::terminate:

int Foo() noexcept
{
    try
    {
        throw std::runtime_error("error");
    }
    catch(...)
    {
        ::std::terminate();
    }
}

Определить, что в теле функции исключений действительно не выбрасывается и соптимизировать их перехват компиляторы могут только в самых простых случаях. Идея была в том, что оптимизацию сможет осуществить вызывающий код. Но на практике это все не работает и контроля над исключениями во время компиляции, особенно после выкидывания спецификаторов исключений, в с++ фактически нет.

Answer 2

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

Понятно, что вы хозяин своему слову - сам дал, сам и назад забрал! Только потом не удивляйтесь результатам - завершению программы.

См., например, эту статейку.

READ ALSO
VK open api, wall.post невозможно прикрепить фото, почему?

VK open api, wall.post невозможно прикрепить фото, почему?

Отправляю запрос, в переменной data содержится результат вызова метода photossaveWallPhoto, ошибок нет

205
Как изменить id элемента с помощью js

Как изменить id элемента с помощью js

Не получается изменить id элемента

216
как вставить иконку в кнопку

как вставить иконку в кнопку

создавая динамически кнопку button с помощью jquery:

229
Книги и другие материалы для обучения

Книги и другие материалы для обучения

Какие книги могут пригодиться для обучения?

221