![]() |
Безопасный аналог 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 имеет достаточный размер, чтобы уместить указатель на любые данные. Это, однако, не относится к указателям на функции. |
|
Статистика |
|