Является ли reinterpret_cast в основном бесполезным?

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

16
задан Community 23 May 2017 в 11:45
поделиться