Во-первых, приведения функциональных стилей являются новыми приведениями в стиле C ++. Они делают то же самое.
Приведение в стиле C сначала пытается static_cast
, а если это не помогает, выполняет reinterpret_cast
1. Это плохо, потому что операции, предназначенные для простого изменения, могут стать очень странными.
В качестве примера предположим, что у вас есть Foo* f
и совершенно не связанный класс Bar
. Вы можете (Bar*)f
, и он будет молча переинтерпретировать *f
как Bar
, что, вероятно, приведет к неопределенному поведению.
static_cast
будет работать в этой ситуации, только если Foo
и Bar
относятся к родственным типам.
Теперь даже static_cast
может быть слишком сильным, поэтому я часто пишу шаблон implicit_cast
или non_cast
, который преобразует без преобразования. Точно так же я пишу as_const
, который добавляет const
, вместо того, чтобы требовать const_cast
(который может как добавлять, так и удалять const
, а удаление const
намного опаснее, чем его добавление).
Несколько раздражает то, что в C ++ нет явного безопасного преобразования типов, и я не знаю, как его написать (такой, который будет выполнять explicit
конструкторы, но не будет приводить "вниз" иерархию типов, как static_cast
будет).
1 это чрезмерное упрощение, но достаточно близкое к истине.
person
Yakk - Adam Nevraumont
schedule
10.12.2013
reinterpret_cast
, а неstatic_cast
. - person Sergey Kalinichenko   schedule 10.12.2013static_cast
, делает его в моих глазах победителем. - person molbdnilo   schedule 10.12.2013static
,reinterpret
,dynamic
илиconst
. Но никогда не актерский состав в функциональном стиле или в стиле C. - person aardvarkk   schedule 10.12.2013