Оператор reinterpret_cast
Позволяет преобразовывать любой указатель в указатель любого другого типа. Также позволяет преобразовывать любой целочисленный тип в любой тип указателя и наоборот.
Синтаксис
reinterpret_cast < type-id > ( expression )
Замечания
Неправильное reinterpret_cast
использование оператора может быть небезопасным. Если требуемое преобразование не является низкоуровневым по самой своей природе, следует использовать один из других операторов приведения типов.
Оператор reinterpret_cast
может использоваться для преобразований, таких как char*
int*
, или One_class*
для Unrelated_class*
, которые по сути небезопасны.
Результат reinterpret_cast
не может быть безопасно использован для чего-либо, кроме приведения обратно к исходному типу. Другие применения в лучшем случае будут непереносимыми.
Оператор reinterpret_cast
не может отбросить const
volatile
атрибуты или __unaligned
атрибуты. Сведения об удалении этих атрибутов см . в const_cast операторе .
Оператор reinterpret_cast
преобразует значение указателя NULL в значение null указателя целевого типа.
Одно практическое использование reinterpret_cast
заключается в хэш-функции, которая сопоставляет значение с индексом таким образом, что два разных значения редко заканчиваются одним и тем же индексом.
#include <iostream>
using namespace std;
// Returns a hash code based on an address
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}
using namespace std;
int main() {
int a[20];
for ( int i = 0; i < 20; i++ )
cout << Hash( a + i ) << endl;
}
Output:
64641
64645
64889
64893
64881
64885
64873
64877
64865
64869
64857
64861
64849
64853
64841
64845
64833
64837
64825
64829
Позволяет reinterpret_cast
указателю рассматриваться как целочисленный тип. Затем для получения уникального индекса (уникального с высокой степенью вероятности) к результату применяется побитовый сдвиг и операция XOR с самим собой. Далее индекс усекается с использованием стандартного для языка C приведения к типу возвращаемого значения функции.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по