Какой актерский состав использовать; static_cast или reinterpret_cast? - PullRequest
9 голосов
/ 18 декабря 2010
int i = 1000;
void *p = &i;

int *x = static_cast<int*>(p);
int *y = reinterpret_cast<int*>(p);

какой приём следует использовать для преобразования из void* в int* и почему?

Ответы [ 4 ]

14 голосов
/ 18 декабря 2010

static_cast при условии, что вы знаете (в соответствии с дизайном вашей программы), что на самом деле указанная вещь является int.

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

С этим допущением,ничего не интерпретируется - void является неполным типом, что означает, что он не имеет значений, поэтому вы ни в коем случае не интерпретируете ни сохраненное значение int как void, ни сохраненное значение void как int.void* - это просто уродливый способ сказать: «Я не знаю тип, но я собираюсь передать указатель кому-то еще, кто знает».

reinterpret_cast, если выпропущенные детали, которые означают, что вы могли бы на самом деле читать память с использованием типа, отличного от того, для которого был написан тип, и помните, что ваш код будет иметь ограниченную переносимость.

Кстати, не очень много веских причиндля использования указателя void* таким образом в C ++.Интерфейсы обратного вызова в стиле C часто можно заменить либо функцией шаблона (для всего, что напоминает стандартную функцию qsort), либо виртуальным интерфейсом (для всего, что напоминает зарегистрированного слушателя).Если ваш код C ++ использует какой-то C API, то, конечно, у вас нет большого выбора.

1 голос
/ 18 декабря 2010

В текущем C ++ вы не можете использовать reinterpret_cast, как в этом коде.Для преобразования void* в int* вы можете использовать только static_cast (или эквивалентное приведение в стиле C).

Для преобразования между различными указателями типов функций или между различными указателями типов объектов необходимо использовать reinterpret_cast.

В C ++ 0x reinterpret_cast<int*>(p) будет эквивалентно static_cast<int*>(p).Это, вероятно, включено в один из следующих WP.

Заблуждение состоит в том, что reinterpret_cast<T*>(p) будет интерпретировать биты p так, как если бы они представляли T*.В этом случае он будет читать значение p, используя тип p, и затем это значение преобразуется в T*.Фактический type-pun , который непосредственно считывает биты p с использованием представления типа T*, происходит только при приведении к ссылочному типу, как в reinterpret_cast<T*&>(p).

Насколько я знаю, все текущие компиляторы допускают reinterpret_cast из void* и ведут себя эквивалентно соответствующим static_cast, даже если это не разрешено в текущем C ++ 03.Количество кода, нарушенного при его отклонении, не будет забавным, поэтому у них нет мотивации запретить его.

0 голосов
/ 22 мая 2011
0 голосов
/ 18 декабря 2010

Исходя из семантики вашей проблемы, я бы переосмыслил, потому что именно это вы и делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...