Можно ли использовать приведение в стиле C для встроенных типов, таких как long x = (long) y; или это все еще считается плохим и опасным?
Не используйте их, никогда. Причины их использования применимы и здесь. По сути, как только вы их используете, все ставки отключены, потому что компилятор вам больше не поможет. Хотя это более опасно для указателей, чем для других типов, оно потенциально все еще опасно и дает плохую диагностику компилятора в случае ошибок, тогда как приведения новых стилей предлагают более богатые сообщения об ошибках, поскольку их использование более ограничено: Мейерс цитирует пример отбрасывания const
ness: использование любого приведения, отличного от const_cast
, не будет компилироваться, таким образом проясняя , что происходит здесь.
Кроме того, некоторые другие недостатки применяются независимо от типов, а именно синтаксические соображения: приведение в стиле C очень ненавязчиво. Это нехорошо: приведения C ++ четко выделяются в коде и указывают на потенциально опасный код. Их также можно легко найти в IDE и текстовых редакторах. Попробуйте найти приведение в стиле C в большом коде, и вы увидите, насколько это сложно.
С другой стороны, приведения в стиле C не дают никаких преимуществ по сравнению с приведениями в C ++, поэтому даже не стоит искать компромисс.
В более общем плане Скотт Мейерс советует «Минимизировать приведение» в Effective C ++ (пункт 27), поскольку «приведение приводит к разрушению системы типов».