Использование static_cast
: это самый узкий состав, который точно описывает, какое преобразование сделано здесь.
Существует неправильное представление о том, что использование reinterpret_cast
будет лучшим соответствием, поскольку это означает «полностью игнорировать безопасность типов и просто приводить от А к В».
Однако, это на самом деле не описывает эффект reinterpret_cast
. Скорее, reinterpret_cast
имеет несколько значений, для которых все считают, что «отображение, выполняемое reinterpret_cast
, определяется реализацией». [5.2.10.3]
Но в частном случае приведения от void*
к T*
отображение полностью определено стандартом; а именно, чтобы назначить тип указателю без типа без изменения его адреса.
Это причина для предпочтения static_cast
.
Кроме того, и, возможно, более важным является тот факт, что каждое использование reinterpret_cast
совершенно опасно, потому что оно действительно преобразовывает что-либо во что-то еще (для указателей), тогда как static_cast
гораздо более ограничительно, обеспечивая тем самым лучший уровень. защиты. Это уже спасло меня от ошибок, когда я случайно попытался привести один тип указателя к другому.