LINUX.ORG.RU

Багофича эксепшенов с++ ?

 , ,


0

2

Такой код:

#include <iostream>
#include <stdexcept>
using namespace std;

void g() try
{
    throw std::out_of_range( "range exception" );
}
catch( std::exception &e )
{
    cout << "g() catch " << e.what() << endl;
}

// bool or int exception can be thrown
void (*pf)() throw(bool, int) = g;

int main() {
    (*pf)(); // Должен возникать UNEXPECTED EXCEPTION
    cout << "wtf?" << endl;
    return 0;
}
prompt> g() catch range exception
prompt> wtf?
GCC 4.7.2 - ошибок компиляции нет, работает без unexpected exception (т.е. неправильно).
Что за фигня?

Ответ на: комментарий от KblCb

Он вроде не std::out_of_range хочет, а (цитирую) «UNEXPECTED EXCEPTION».

mr_doug ()
Ответ на: комментарий от no-such-file

И правильно, но только в этом случае его out_of_range успешно перехватывается и наружу не выходит. если сделать так:

catch( std::exception &e )
{
    cout << "g() catch " << e.what() << endl;
    throw;
}
, то всё благополучно упадёт

Gvidon ★★★★ ()
Последнее исправление: Gvidon (всего исправлений: 1 )

Небольшое сравнение компиляторов: g++ молча проглатывает сабжевый код, интел выдаёт предупреждение, а шланг его компилировать вообще наотрез отказывается

Gvidon ★★★★ ()
Ответ на: комментарий от Gvidon

но только в этом случае его out_of_range успешно перехватывается

Вот именно.

no-such-file ★★★★★ ()

По стандарту должна быть ошибка компиляции:

A similar restriction applies to assignment to and initialization of pointers to functions, pointers to member functions, and references to functions: the target entity shall allow at least the exceptions allowed by the source value in the assignment or initialization.

А код выбрасывания unexpected exception встраивается в саму функцию, потому каст указателей его в принципе дать не смог бы.

Pavval ★★★★★ ()
Ответ на: комментарий от nerdogeek
test.cc(15): warning #878: incompatible exception specifications
  void (*pf)() throw(bool, int) = g;
Gvidon ★★★★ ()

Мне вот интересно зачем вообще такой код?

pulo ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.