reinterpret_cast
заставляет данные, которые вы преобразуете, рассматриваться как другой тип без какого-либо преобразования. Согласно стандарту, единственное, что определяет поведение после reinterpret_cast
, - это reinterpret_cast
его возврат к исходному типу.
Это звучит немного бесполезно, но одна из причин, по которой вам может понадобиться это, например, использование определенных библиотек C (например, pthreads) в C ++. Многие библиотеки C, которые используют обратные вызовы, передают в функцию обратного вызова параметр типа void*
. В C ++ правильный способ справиться с этим - взять указатель на то, что вы хотите использовать в качестве параметра, reinterpret_cast
на void*
при передаче его в библиотеку C, а затем reinterpret_cast
на любое другое это на самом деле внутри обратного вызова.
Хотя не гарантируется, что стандарт определит поведение , на большинстве платформ / компиляторов reinterpret_cast
просто рассматривает данные как разные типы, используя один и тот же битовый шаблон , Например, если у вас есть 32-разрядное двойное число d
, битовая комбинация которого равна 01101010 00111100 01101010 01000001
, и вы пишете int i = reinterpret_cast<int>(d)
, тогда i
будет целым числом, битовая комбинация которого 01101010 00111100 01101010 01000001
, даже если это будет представляет сильно отличающееся числовое значение в виде целого числа от двойного. И, очевидно, это может быстро привести к неприятностям, если задействованные типы имеют разный размер.