Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
Здравствуйте, Аноним, Вы писали:
А>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
Понятие STL — времен царя Гороха. Есть стандартная библиотека. Есть реализации freestanding и hosted.. Исключения нужные есть и там, и там.
Как работает доисторическая реализация, не соответствующая стандарту — личное дело этой реализации и как там динамик каст себя ведет — бог его знает.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Аноним, Вы писали:
А>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
А как связаны STL и dynamic_cast? И что это за платформы где нет STL? Там С++ видимо нет.
Здравствуйте, Lorenzo_LAMAS, Вы писали: L_L>Понятие STL — времен царя Гороха. Есть стандартная библиотека.
Мне показалось или вы както странно трактуете эти три буквы? STL и есть стандартная библиотека, входящая в стандарт, от царя Гороха и по сей день. Как верно заметили, где нет STL там видимо нет и с++
BC>Мне показалось или вы както странно трактуете эти три буквы? STL и есть стандартная библиотека, входящая в стандарт, от царя Гороха и по сей день. Как верно заметили, где нет STL там видимо нет и с++
Что вам кажется, знаете только вы сами. Аббревиатуру STL использовали в 90х, в наши есть С++ и его стандартная библиотека, которую уже не называют STL.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Аноним, Вы писали:
А>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast.
Именно так.
А>std::bad_cast относится к STL?
Как совершенно справедливо заметил Lorenzo_LAMAS, понятие STL несколько устарело — такой аббревиатуры в тексте стандарта нет вообще. Но во избежание недоразумений будем считать, что STL является частью стандартной библиотеки С++, а потому std::bad_cast — часть стандартной библиотеки.
А>На платформах где нет STL как это работает.
На платформах, которые не полностью поддерживают стандартную библиотеку, это должно быть отражено в документации.
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, placement_new, Вы писали:
_>>А как связаны STL и dynamic_cast? И что это за платформы где нет STL? Там С++ видимо нет.
MD>Например, разработка под Symbian. C++ есть, STL нету.
А dynamic_cast там вообще есть?
Of course, the code must be complete enough to compile and link.
Здравствуйте, Аноним, Вы писали:
А>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
Не хочу вдаваться в рассуждения о том, что есть STL, замечу, что даже в самом современном компиляторе исключения, как правило, могут быть отключены опцией командной строки. Что в этом случае вернет dynamic_cast — полагаю, 0.
И, кстати, не уверен, что dynamic_cast должен бросать исключение — скорее возврат 0 это более ожидаемая реакция.
MSDN пишет, что:
[msdn]
In Visual C++ 2005, there are two breaking changes in the behavior of dynamic_cast in managed code:
dynamic_cast to a pointer to the underlying type of a boxed enum will fail at runtime, returning 0 instead of the converted pointer.
dynamic_cast will no longer throw an exception when type-id is an interior pointer to a value type, with the cast failing at runtime. The cast will now return the 0 pointer value instead of throwing.
[/msdn]
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
А>>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
M> Не хочу вдаваться в рассуждения о том, что есть STL, замечу, что даже в самом современном компиляторе исключения, как правило, могут быть отключены опцией командной строки. Что в этом случае вернет dynamic_cast — полагаю, 0.
Полную ерунду написал, простите. Невнимательно прочитал исходное сообщение. Тем не менее, исключения могут быть отключены даже в самом современном компиляторе, и что вернет dynamic_cast — непонятно. Как минимум — будет варнинг.
Здравствуйте, Аноним, Вы писали:
А>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
С DMC (Digital Mars C++ Compiler) по умолчанию STL не идет.
Watcom-овский компилер имеет сильно урезанный STL.
Оба объявляют std::bad_cast в файле <typeinfo>. Относится он к STL или нет — как авторы компилятора посчитают.
В объектных файлах CRT уже присутствует код, выполняемый для dynamic_cast, и даже имплементация отдельных функций-членов bad_cast (например, виртуальный метод what() в DMC).
Внутренностям dynamic_cast, в общем-то и не важно, объявлен ли у вас в коде символ std::bad_cast. Главное, чтоб он в исходниках CRT присутствовал.
Здравствуйте, Marty, Вы писали:
M>Полную ерунду написал, простите. Невнимательно прочитал исходное сообщение. Тем не менее, исключения могут быть отключены даже в самом современном компиляторе, и что вернет dynamic_cast — непонятно. Как минимум — будет варнинг.
Как вариант не скомпилячит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
d.4:
d.4>С DMC (Digital Mars C++ Compiler) по умолчанию STL не идет.
Судя по этим тестам, у него вообще соответствие стандарту так себе. В частности, там неправильно работает typeid(*null_pointer_value_of_polymorphic_type).
d.4>Оба объявляют std::bad_cast в файле <typeinfo>. Относится он к STL или нет — как авторы компилятора посчитают.
Если называть STL всё подряд, то смысл аббревиатуры утрачивается.
Здравствуйте, Аноним, Вы писали:
А>Немного непонятно что происхлодит при dynamic_cast когда преобразуются ссылки (не указатели). Если тип неверный то вроде бы кидается исключение std::bad_cast. std::bad_cast относится к STL? На платформах где нет STL как это работает.
А что за платформа, если не секрет?
Вообще, если речь идет о том, как обрабатывать ошибки cast'а при отключенных исключениях, то решение тут одно — не использовать код, который может сгенерировать исключение.
Проблема заключается в том, что по Стандарту при dynamic_cast ссылок исключение должно быть сгенерировано в случае ошибки. Если же программист по каким-то причинам отключил обработку исключений при компиляции, то по Стандарту он должен использовать dynamic_cast для указателей. Стандарт оговаривает две формы dynamic_cast и переносит всю ответственность за использование на программиста. Поэтому, так как по Стандарту исключение должно быть сгенерировано, то исключение будет сгенерировано в любом случае, даже если программист отключил обработку исключений при компиляции. Далее при возникновении исключения, если обработчиков исключений нет, произойдет простой вызов terminate() и процесс завершится.
Всё это правда, если реализация стандартной библиотеки соответствует Стандарту. Если же реализация не соответствует Стандарту, то в документации к ней долно быть описание. Однако при использовании такой неСтандартной библиотеки нужно понимать, что скорее всего у такого кода будут проблемы с портированием.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
MD>>>Например, разработка под Symbian. C++ есть, STL нету.
L_L>>А dynamic_cast там вообще есть?
L_L>Ок, похоже, нет: http://wiki.forum.nokia.com/index.php/Typecasting_in_Symbian. Так что, и С++ нету, а есть некий диалект.
Там даже не один, а два диалекта, потому что компилеров два: под эмулятор и под железку. А точнее, даже три, ибо под железку есть GCCE и есть платный ARM-компилер. Код, особенно с шаблонами, имеет "ньюансы собираемости" под этим зоопарком.