Почему блок catch игнорируется и вызывается std::terminate?C++

Программы на C++. Форум разработчиков
Anonymous
Почему блок catch игнорируется и вызывается std::terminate?

Сообщение Anonymous »

У меня есть программа, которая работает должным образом, если она скомпилирована GCC, но ведет себя странно после переноса в Visual Studio.
Программа выдает исключение из деструктора noException(false) (я знаю, что это плохая практика, но не полностью запрещена) объекта, переданного в качестве аргумента функции.
Вот минимальный пример:

Код: Выделить всё

#include 
#include 

struct A {
~A() noexcept(false) { throw 1; }
};

void f( A ) { }

int main() {
std::set_terminate([]() {
std::_Exit( 2 );
});
try {
f( {} );
}
catch( int x ) {
return x;
}
}
При использовании GCC исключение перехватывается, и программа возвращает 1.
В MSVC (Visual Studio) программа вызывает обработчик завершения и возвращает 2. Онлайн-демо.
Правильен ли здесь компилятор MSVC (программа неправильная или зависит от реализации)?

Подробнее здесь: https://stackoverflow.com/questions/798 ... is-invoked

Вернуться в «C++»