какое преобразование является правильным в C ++?

Я хочу преобразовать void * в char * reinterpret_cast и static_cast, для чего подходит?static_cast<char*> or reinterpret_cast<char*>

6

Решение

Это в основном вопрос стиля. static_cast может сделать любое преобразование
который является противоположностью неявного преобразования (и который не
Удалить const или же volatile). поскольку char* в void* неявно,
static_cast показалось бы указанным; обычное правило заключается в использовании
static_cast в предпочтении reinterpret_cast когда возможно.

Учитывая, что это использование особенно опасно, некоторые правила кодирования
может предпочесть reinterpret_cast, чтобы обозначить этот факт.

5

Другие решения

static_cast (вместе с dynamic_cast) предназначен для приведения между объектами в одной иерархии классов, в то время как reinterpret_cast это бросить между различными типами полностью. Так что в вашем случае вы должны пойти на reinterpret_cast,

3

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 *,

3

reinterpret_cast в этом случае работает для вас, но не стоит часто использовать его, так как это самый опасный состав. В принципе, вы можете reinterpret_cast полностью не связанные указатели, так что вы обязаны позаботиться о результате (т.е. проверить, является ли результат действительным для дальнейшего использования).

1

Я думаю, это зависит от контекста:
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 *, которые по своей сути небезопасны.

-1