- 1
int len = dynamic_cast<GatewayRec *>(*Iter)->PrefixMatch(aliases, matchedalias, priority);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+61
int len = dynamic_cast<GatewayRec *>(*Iter)->PrefixMatch(aliases, matchedalias, priority);
gnugk
А зачем им указатель в инте?
... и ничего не ломается.
> А зачем им указатель в инте?
А указатель не в инте. Инт - результат вызова PrefixMatch'а над результатом динамического каста.
Тут подвох в другом ;)
Я сначала подумала, что он выбросит bad_cast, но потом посмотрела документацию - нет, оказывается, bad_cast кидается только со ссылками, а с указателями возвращается нулевой указатель.
М-да. Крестопроблемы.
В чём крестопроблемы? В языке намеренно два вида каста. Ссылки не могутдолжны быть невалидными, поэтому dynamic_cast на них может сигнализировать об ошибке только исключением.
Указатели могут быть nullptr, dynamic_cast для указателей возвращает nullptr. Есть даже специальная конструкция, полезная, когда ты не уверен в успешности даункаста:
Я знаю, но это не повод делать два разных поведения в зависимости от того, что кастуется.
"По правильному" неверный dynamic_cast должен бросать исключение. Всегда. Проверять возвращаемое значение - это стиль сишки, ретроградство эксепшенофобов. Хотите нулевой указатель - ловите исключение и присваивайте. Ну или сначала проверяйте, прежде чем кастовать.
Давайте тогда обычный new будет при нехватке памяти возвращать нулевой указатель, а new[] - кидать bad_alloc. Ну а что, разные операторы же!
> Есть даже специальная конструкция, полезная, когда ты не уверен в успешности даункаста
Костыльный закос под жабовский instanceof поверх костыльной технологии. И так в ваших крестах всё.
Исключения - опциональная фича языка, и некоторые компиляют код с выключенными исключениями, хоть я это и не одобряю.
> Костыльный закос под жабовский instanceof
Ну вообще-то dynamic_cast появился до рождения самой жабы и идея скорее заимствована из тайп-свича в Simula.
А жабий instanceof - ещё бОльшее убожество, там потом ещё один каст писать надо.
RTTI (включая dynamic_cast) тоже отключают, и что? Ретрограды должны страдать. Либо уж и исключения, и RTTI, либо ни того, ни другого.
> Ну вообще-то dynamic_cast появился до рождения самой жабы и идея скорее заимствована из тайп-свича в Simula.
Не сам dynamic_cast, а вот такая идиома. Или она тоже до Жабы появилась?
> А жабий instanceof - ещё бОльшее убожество, там потом ещё один каст писать надо.
Тут согласна, компилятор мог бы и без каста догадаться, по одному instanceof. Кстати, компилятор Ceylon так и делает. Например, такой код скомпилируется:
СЕНСАЦИЯ! dynamic_cast можно использовать с отключенным RTTI.
> Или она тоже до Жабы появилась?
Весьма вероятно.
http://pastebin.com/3SRktZZR
Я это и имел в виду.
А вообще суровые мужики пишут свой dynamic_cast, работающий за O(1), а не юзают стандартное тормозное говно.
Иногда нужно для реализации алгебраических типов данных, например.
ПИРФОМАНС
Ищи ебарей в другом месте.
так-то плохую ссылку сделать можно и без динамик-каста, приложение упадет при обращении к ней
http://ideone.com/jyWpwp
ещё бы. ведь адрес такой ссылки нулевой:
http://ideone.com/ME9Mhm
http://ideone.com/OshNcu
А там, кстати, есть new, который возвращает нулевой указатель :)
ага, new (std::nothrow)
этим даже страдает boost::lexical_cast, их просили добавить опционально, например, указание локали, отказались
> Крестопроблемы
O_o
Да, не. Просто необычно это :)
C++ is a man's language. You have to have serious cohones to sling that code around. You taste the testosterone running through every line of that code.
Java is more ... estrogen like language.
...
C++ programmer is a wild hunter that stabs a bore in a heart with a spear.
Едические рога! Оно вернулось!
Хотя Webkill [ненастоящий] таки вроде помер.
непроверенный dynamic_cast?
не во все школы ещё завезли глушилки сотовой связи