Может кто-нибудь прокомментировать различия?
Static_cast <int> (foo) vs. (int) foo
Ответ 1
Разница в том, что (int) foo может означать полдюжины разных вещей. Это может быть static_cast (преобразование между статически известными типами), это может быть const_cast (добавление или удаление константы), или это может быть reinterpret_cast (преобразование между типами указателей)
Компилятор пытается выполнить каждый из них, пока не найдет тот, который работает. Это означает, что он может не всегда выбирать тот, который вы ожидаете, поэтому он может стать тонким источником ошибок.
Кроме того, static_cast намного проще искать или выполнять поиск/замену.
Ответ 2
Посмотрите, что Stroustrup должен сказать об этом, включая следующее:
Поскольку C-style cast (T) можно использовать для выражения многих логически разных операций, у компилятора есть только самый простой шанс поймать злоупотребления. [...]
Были введены "приведения нового стиля", чтобы дать программистам возможность более четко изложить свои намерения и компилятор поймать больше ошибок. [...]
В частности, С++ делает различие между static_cast
и reinterpret_cast
:
Идея заключается в том, что преобразования, разрешенные static_cast, в несколько меньшей степени приводят к ошибкам, чем те, которые требуют reinterpret_cast. В принципе, можно использовать результат static_cast, не возвращая его в исходный тип, тогда как вы должны всегда возвращать результат reinterpret_cast обратно в исходный тип, прежде чем использовать его для обеспечения переносимости.
Ответ 3
(int) foo сравнивает большинство с С++ reinterpret_cast<int>
, то есть никаких проверок достоверности приведения.