Я хочу преобразовать void * в char * reinterpret_cast и static_cast, для чего подходит?static_cast<char*> or reinterpret_cast<char*>
Это в основном вопрос стиля. static_cast
может сделать любое преобразование
который является противоположностью неявного преобразования (и который не
Удалить const
или же volatile
). поскольку char*
в void*
неявно,
static_cast
показалось бы указанным; обычное правило заключается в использовании
static_cast
в предпочтении reinterpret_cast
когда возможно.
Учитывая, что это использование особенно опасно, некоторые правила кодирования
может предпочесть reinterpret_cast
, чтобы обозначить этот факт.
static_cast
(вместе с dynamic_cast
) предназначен для приведения между объектами в одной иерархии классов, в то время как reinterpret_cast
это бросить между различными типами полностью. Так что в вашем случае вы должны пойти на reinterpret_cast
,
reinterpret_cast
между типами указателей определяется с точки зрения static_cast
через void *
:
5.2.10 Переинтерпретация приведения [expr.reinterpret.cast]
7 — […] Когда prvalue
v
типа «указатель наT1
»Преобразуется в тип« указатель на резюмеT2
», Результатstatic_cast<cv
если оба
T2*>(static_cast<cv void*>(v))T1
а такжеT2
являются стандартный макет типы и расклад
требованияT2
не более строгие, чем те,T1
или если какой-либо типvoid
,
Так что, если вы конвертируете между типами указателей объектов стандартного макета (например, char *
) с помощью void *
, затем static_cast
подходит для преобразования в / из void *
,
reinterpret_cast
в этом случае работает для вас, но не стоит часто использовать его, так как это самый опасный состав. В принципе, вы можете reinterpret_cast
полностью не связанные указатели, так что вы обязаны позаботиться о результате (т.е. проверить, является ли результат действительным для дальнейшего использования).
Я думаю, это зависит от контекста:
static_cast<>
следует использовать в случае, когда есть неявное преобразование.
reinterpret_cast<>
следует использовать, когда оба указателя имеют разные типы
Хотя reinterpret_cast не рекомендуется.
Вы не должны использовать static_cast для приведения иерархии наследования, а скорее dynamic_cast.
От
http://msdn.microsoft.com/en-us/library/e0w9f63b(v=vs.80).aspx
Оператор reinterpret_cast может использоваться для преобразований, таких как char * в int * или One_class * в Unrelated_class *, которые по своей сути небезопасны.