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