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

      Комментарии к записи Безопасный аналог reinterpret_cast отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3637

    Даже если вдруг вас кто-то или что-то заставляет воспользоваться reinterpret_cast (например, вас поймали хулиганы и заставляют писать плохой код), все равно не делайте этого. Вместо этого используйте два static_cast через void* или void const*.

    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 имеет достаточный размер, чтобы уместить указатель на любые данные. Это, однако, не относится к указателям на функции.

Для ответа в этой теме необходимо авторизоваться.