Ответ 1
A static_cast
- это бросок от одного типа к другому, который (интуитивно) является отлитом, который при некоторых обстоятельствах может быть успешным и иметь смысл в отсутствие опасного броска. Например, вы можете static_cast
a void*
на int*
, так как void*
может фактически указывать на int*
или int
на char
, поскольку такое преобразование имеет смысл. Однако вы не можете static_cast
a int*
на double*
, так как это преобразование имеет смысл только тогда, когда int*
каким-то образом исказилось, чтобы указать на double*
.
A reinterpret_cast
- это трансляция, которая представляет собой небезопасное преобразование, которое может переинтерпретировать биты одного значения в виде бит другого значения. Например, отбрасывание int*
в double*
является законным с помощью reinterpret_cast
, хотя результат не указан. Точно так же отличное от int
до a void*
совершенно законно с reinterpret_cast
, хотя оно небезопасно.
Ни static_cast
, ни reinterpret_cast
не может удалить const
из чего-либо. Вы не можете использовать const int*
для int*
, используя любую из этих приведений. Для этого вы должны использовать const_cast
.
Листинг C-стиля формы (T)
определяется как попытка сделать static_cast
, если это возможно, и вернуться к reinterpret_cast
, если это не сработает. Он также применит const_cast
, если это абсолютно необходимо.
В общем, вы всегда должны предпочитать static_cast
для бросков, которые должны быть безопасными. Если вы случайно попробуете сделать листинг, который не определен, компилятор сообщит об ошибке. Используйте только reinterpret_cast
, если то, что вы делаете, действительно меняет интерпретацию некоторых бит в машине и использует только C-стиль, если вы готовы рисковать делать reinterpret_cast
. Для вашего случая вы должны использовать static_cast
, так как downcast из void*
четко определен в некоторых случаях.