Подтвердить что ты не робот

В чем разница между static_cast и reinterpret_cast?

Возможный дубликат:
Когда следует использовать static_cast, dynamic_cast и reinterpret_cast?

Я использую c-функцию в С++, где структура, переданная как аргумент типа void в c, непосредственно хранится в том же структурном типе.

например, в C.

void getdata(void *data){
    Testitem *ti=data;//Testitem is of struct type.
}

чтобы сделать то же самое в С++, я использую static_cast:

void foo::getdata(void *data){
    Testitem *ti = static_cast<Testitem*>(data);
}

и когда я использую reinterpret_cast, он выполняет ту же работу, накладывая struct

когда я использую Testitem *it=(Testitem *)data;

это делает то же самое. Но как влияет структура на использование трех из них.

4b9b3361

Ответ 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* четко определен в некоторых случаях.