Модификатор noexcept говорит компилятору что функция с данным модификатором не будет выбрасывать исключение. Это позволяет компилятору генерировать более оптимальный код.
Ответственность за то что функция с модификатором noexcept не будет выбрасывать исключение лежит целиком на программисте. Если исключение будет выброшено, то оно не будет перехвачено и программа завершится.
#include <iostream> // cout
#include <exception> // set_terminate()
void exc(){ // Функция выбрасывает исключение
throw 1;
}
void noexc() noexcept{ // Функция выбрасывает исключение, но не должна этого делать т.к. помечена noexcept
throw 1;
}
int main()
{
//std::set_terminate([](){ std::cout << "terminate() called\n"; exit(1);}); // Можно переопределить стандартное завершение программы после выброса исключения
try { // Вызываем функцию с ловлей исключения
exc();
} catch(...)
{
std::cout << "Catch exc!\n";
}
try { // Вызываем noexcept функцию с ловлей исключения. Но этого не произойдет - программа завершится
noexc();
} catch(...)
{ // Никогда не будет выполнено
std::cout << "Catch noexc!\n";
}
std::cout << "end program"; // Никогда не будет выполнено
}
/* Вывод программы
Catch exc!
terminate called after throwing an instance of 'int'
или в случае раскоментирования строки 14
Catch exc!
terminate() called
*/
Однако можно кидать и ловить исключения внутри noexcept функции. Ниже приведенный код вполне корректный.
void noexc() noexcept{ // Функция выбрасывает исключение, но не должна этого делать т.к. помечена noexcept
try{
throw 1;
}catch(...){
std::cout << "catch inside \n";
}
}