Оператор reinterpret_cast
Оператор reinterpret_cast считается жестко машинно-зависимым. Для безопасного применения оператора reinterpret_cast следует хорошо понимать, как именно реализованы используемые типы, а также то, как компилятор осуществляет приведение.
Обсудим следующий пример приведения: int *ptr_int;char *ptr_char = reinterpret_cast(ptr_int);
В подобном случае программист должен помнить, что фактическим типом объекта, адрес которого содержит указатель ptr_char, является int, а не символьный тип.
Любая попытка применения указателя там, где необходим обычный символьный указатель, скорее всего, потерпит неудачу именно в период выполнения. Например, его использование для инициализации объекта типа string, как в следующем случае, приведет к весьма необычному поведению во время вычислений. string str(ptr_char);
Использование указателя рtr_char для инициализации объекта типа string — это наглядная демонстрации опасности явных приведений. Проблема заключается в том, что при изменении типа компилятор не формирует никаких предупреждений. При инициализации указателя ptr_char адресом для типа int компилятор не выдаст какого-либо сообщения об ошибке, поскольку задано явное преобразование. Однако любое последующее применение указателя рtr_char подразумевает, что он содержит адрес значения типа char. Компилятор не способен выяснить, что на
Совместимость типов и неявное приведение |
311 |
самом деле указатель хранит адреса целых чисел. Таким образом, инициализация строки Б'Ъг при помощи указателя вполне допустима, но по сути даже преступна. Отследить причину такой проблемы чрезвычайно трудно. |