Почему блок 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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