![]() |
21. Преобразования типов и исключения | ||
Какие преобразования типов возможны в момент перехвата исключения? Что мы увидим на экране? |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <string> class A { }; class B { public: B() { } B(A const&) { } operator A() { return A(); } }; template <class throw_type, class catch_type> void throw_catch(throw_type trw = throw_type()) { try { throw trw; } catch(catch_type) { std::cout << typeid(catch_type).name() << std::endl; } catch(throw_type) { std::cout << typeid(throw_type).name() << std::endl; } } int main() { throw_catch <char*, void*> (); throw_catch <void*, char*> (); throw_catch <char*, void const*> (); throw_catch <char const*, void*> (); throw_catch <char*, void volatile*> (); throw_catch <char volatile*, void*> (); throw_catch <char, int> (); throw_catch <int, char> (); throw_catch <A, B> (); throw_catch <B, A> (); throw_catch <char const*, std::string> ("Hello"); return 0; } |
Правильный ответ. | ||
В момент перехвата исключения возможны следующие преобразования: срезка, приведение ссылок и указателей вверх по иерархии классов (если такое приведение однозначно), приведение указателей к void* или void const*, а также ограничивающие преобразования, такие как добавление const или volatile. Все остальные преобразования, которые могут быть выполнены неявно при обычном присваивании, в момент перехвата исключения не допускаются. В этот раз на консоли вы увидите следующее: void * void * void const * char const * void volatile * char volatile * char int class A class B char const * |
|
Статистика |
|