Я прочитал различные предыдущие вопросы о использовании 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 единственным безопасным вариантом?