Брутально и бессердечно о программировании и проектировании
ГлавнаяФорумАртПаттерныАнтипаттерныТест-драйвВопрос-ответКнигорецензииСправочная

Безопасный аналог reinterpret_cast

Даже если вдруг вас кто-то или что-то заставляет воспользоваться reinterpret_cast (например, вас поймали хулиганы и заставляют писать плохой код), все равно не делайте этого. Вместо этого используйте два static_cast через void* или void const*.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char* char_ptr   = new char[10];
float* float_ptr = static_cast<float*>
                   (
                       static_cast<void*>
                       (
                           char_ptr
                       )
                   );

char const* char_cptr   = char_ptr;
float const* float_cptr = static_cast<float const*>
                          (
                              static_cast<void const*>
                              (
                                  char_cptr
                              )
                          );
 
Дело в том, что стандарт совершенно не гарантирует то, что указатели на разные типы данных имеют одинаковый размер и структуру. reinterpret_cast выполнит приведение что называется «в лоб», и при этом не будет никакой гарантии того, что при этом не произойдет потери данных и полученный указатель будет валиден. Используйте двойной static_cast вместо reinterpret_cast. Стандарт гарантирует, что указатель на void имеет достаточный размер, чтобы уместить указатель на любые данные. Это, однако, не относится к указателям на функции.

Оглавление
Статистика
© 2007—2009 Inside C++ Коммерческие услугиКонтактная информация

Hydronic floor heating. Radiant floor heating tubing. Hydronic heating. цены на автомобили chevrolet, opel в оренбурге. Цены на цифровые видеокамеры, купить видеокамеру в Украине. магазины бижутерии купить. SLKшИНА. Продажа дисков, продажа шин в СПб.. консультант, консультант плюс обновление, законодательство. проститутки москвы это девочки очень прелестные