- 1
int len = dynamic_cast<GatewayRec *>(*Iter)->PrefixMatch(aliases, matchedalias, priority);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+61
int len = dynamic_cast<GatewayRec *>(*Iter)->PrefixMatch(aliases, matchedalias, priority);
gnugk
Soul_re@ver 02.09.2014 09:16 # +1
А зачем им указатель в инте?
bormand 02.09.2014 10:05 # +4
... и ничего не ломается.
> А зачем им указатель в инте?
А указатель не в инте. Инт - результат вызова PrefixMatch'а над результатом динамического каста.
Тут подвох в другом ;)
lucidfox 02.09.2014 10:16 # +4
Я сначала подумала, что он выбросит bad_cast, но потом посмотрела документацию - нет, оказывается, bad_cast кидается только со ссылками, а с указателями возвращается нулевой указатель.
М-да. Крестопроблемы.
roman-kashitsyn 02.09.2014 10:23 # +6
В чём крестопроблемы? В языке намеренно два вида каста. Ссылки не могутдолжны быть невалидными, поэтому dynamic_cast на них может сигнализировать об ошибке только исключением.
Указатели могут быть nullptr, dynamic_cast для указателей возвращает nullptr. Есть даже специальная конструкция, полезная, когда ты не уверен в успешности даункаста:
lucidfox 02.09.2014 11:33 # −1
Я знаю, но это не повод делать два разных поведения в зависимости от того, что кастуется.
"По правильному" неверный dynamic_cast должен бросать исключение. Всегда. Проверять возвращаемое значение - это стиль сишки, ретроградство эксепшенофобов. Хотите нулевой указатель - ловите исключение и присваивайте. Ну или сначала проверяйте, прежде чем кастовать.
Давайте тогда обычный new будет при нехватке памяти возвращать нулевой указатель, а new[] - кидать bad_alloc. Ну а что, разные операторы же!
> Есть даже специальная конструкция, полезная, когда ты не уверен в успешности даункаста
Костыльный закос под жабовский instanceof поверх костыльной технологии. И так в ваших крестах всё.
roman-kashitsyn 02.09.2014 11:43 # +3
Исключения - опциональная фича языка, и некоторые компиляют код с выключенными исключениями, хоть я это и не одобряю.
> Костыльный закос под жабовский instanceof
Ну вообще-то dynamic_cast появился до рождения самой жабы и идея скорее заимствована из тайп-свича в Simula.
А жабий instanceof - ещё бОльшее убожество, там потом ещё один каст писать надо.
lucidfox 02.09.2014 11:50 # 0
RTTI (включая dynamic_cast) тоже отключают, и что? Ретрограды должны страдать. Либо уж и исключения, и RTTI, либо ни того, ни другого.
> Ну вообще-то dynamic_cast появился до рождения самой жабы и идея скорее заимствована из тайп-свича в Simula.
Не сам dynamic_cast, а вот такая идиома. Или она тоже до Жабы появилась?
> А жабий instanceof - ещё бОльшее убожество, там потом ещё один каст писать надо.
Тут согласна, компилятор мог бы и без каста догадаться, по одному instanceof. Кстати, компилятор Ceylon так и делает. Например, такой код скомпилируется:
roman-kashitsyn 02.09.2014 11:52 # 0
СЕНСАЦИЯ! dynamic_cast можно использовать с отключенным RTTI.
> Или она тоже до Жабы появилась?
Весьма вероятно.
lucidfox 02.09.2014 12:05 # 0
http://pastebin.com/3SRktZZR
roman-kashitsyn 02.09.2014 12:08 # 0
Я это и имел в виду.
А вообще суровые мужики пишут свой dynamic_cast, работающий за O(1), а не юзают стандартное тормозное говно.
Иногда нужно для реализации алгебраических типов данных, например.
absolut 04.09.2014 07:09 # +1
roman-kashitsyn 04.09.2014 13:11 # +1
ПИРФОМАНС
kegdan 04.09.2014 15:24 # −2
guest 04.09.2014 23:18 # +2
Ищи ебарей в другом месте.
guest 05.09.2014 08:56 # 0
absolut 04.09.2014 07:15 # 0
defecate-plusplus 04.09.2014 08:14 # 0
так-то плохую ссылку сделать можно и без динамик-каста, приложение упадет при обращении к ней
http://ideone.com/jyWpwp
absolut 04.09.2014 11:35 # 0
ещё бы. ведь адрес такой ссылки нулевой:
http://ideone.com/ME9Mhm
defecate-plusplus 04.09.2014 11:50 # +2
absolut 04.09.2014 12:54 # +2
defecate-plusplus 04.09.2014 13:01 # +1
bormand 04.09.2014 11:46 # 0
absolut 04.09.2014 11:51 # 0
http://ideone.com/OshNcu
bormand 04.09.2014 08:50 # +1
absolut 04.09.2014 11:26 # +1
bormand 02.09.2014 11:48 # +2
А там, кстати, есть new, который возвращает нулевой указатель :)
roman-kashitsyn 02.09.2014 11:50 # +2
ага, new (std::nothrow)
lucidfox 02.09.2014 11:51 # 0
defecate-plusplus 02.09.2014 12:02 # +3
этим даже страдает boost::lexical_cast, их просили добавить опционально, например, указание локали, отказались
3_dar 23.11.2020 22:09 # 0
CHayT 23.11.2020 22:17 # 0
guest3 23.11.2020 22:18 # 0
TarasB 05.09.2014 09:29 # −2
roman-kashitsyn 05.09.2014 10:08 # +5
bormand 05.09.2014 11:58 # 0
TarasB 05.09.2014 12:30 # 0
kegdan 05.09.2014 14:58 # −1
tirinox 02.09.2014 10:35 # 0
> Крестопроблемы
O_o
roman-kashitsyn 02.09.2014 10:53 # +1
tirinox 02.09.2014 10:56 # 0
Да, не. Просто необычно это :)
roman-kashitsyn 02.09.2014 11:13 # +1
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.
eth0 02.09.2014 16:38 # +4
Едические рога! Оно вернулось!
3.14159265 02.09.2014 17:18 # +3
Хотя Webkill [ненастоящий] таки вроде помер.
roman-kashitsyn 02.09.2014 10:17 # +4
непроверенный dynamic_cast?
roman-kashitsyn 02.09.2014 11:16 # +6
defecate-plusplus 02.09.2014 11:20 # +2
не во все школы ещё завезли глушилки сотовой связи
absolut 04.09.2014 07:13 # 0