Я прочитал различные предыдущие вопросы о использовании reinterpret_cast
, и я также прочитал соответствующую формулировку в стандарте С++. По существу, все, что происходит, состоит в том, что результат операции указателя на указатель reinterpret_cast
нельзя безопасно использовать для чего-либо иного, кроме того, что он возвращается к исходному типу указателя.
На практике, однако, большинство видов использования reinterpret_cast
в реальном мире, по-видимому, основаны на (ошибочном) предположении, что a reinterpret_cast
является таким же, как приведение в стиле C. Например, я видел много кода, который использует reinterpret_cast
для перевода из char*
в unsigned char*
для целей подпрограмм преобразования набора символов. Это абсолютно безопасно, но, строго говоря, оно не переносимо - нет гарантии, что reinterpret_cast
от char*
до unsigned char*
не будет разбивать вашу программу при попытке разыменовать указатель unsigned char*
.
Кажется, единственное реальное использование reinterpret_cast
, которое имеет какие-либо реальные гарантии, согласно стандарту, преобразуется из указателя в целое и наоборот.
И все же есть много случаев, когда мы хотим (и должны быть в состоянии) безопасно конвертировать между разными типами указателей. Например: uint16_t*
в новый С++ 0x char16_t*
или действительно любой указатель на базовый тип данных, который имеет тот же размер/выравнивание, что и исходный тип. Тем не менее reinterpret_cast
не дает никаких гарантий, которые должны работать.
Вопрос:. Как мы можем безопасно конвертировать между указателями в базовые типы данных одинакового размера/выравнивания, например char*
→ unsigned char*
? Поскольку reinterpret_cast
, похоже, не гарантирует, что это действительно работает, являются ли C-style единственным безопасным вариантом?