Использование литья в стиле C не является безопасным. Он никогда не проверяет, чтобы разные типы можно было смешивать вместе. Приведение типов в C ++ помогает вам убедиться, что приведение типов выполняется в соответствии со связанными объектами (на основе используемого вами приведения). Это более рекомендуемый способ использования приведений, чем использование традиционных приведений в стиле C, которые всегда вредны.
, что я хочу броситьA*
вchar*
и наоборот, у нас есть два варианта (я имею в виду, многие из нас думают, что у нас есть два варианта,потому что оба, кажется, работают! Отсюда и путаница!)
struct A
{
int age;
char name[128];
};
A a;
char *buffer = static_cast<char*>(static_cast<void*>(&a)); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
Оба работают нормально.
//convert back
A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
Даже это работает отлично!
Так почему у насreinterpret_cast
в C ++, когдас двумя цепями static_cast
может сделать свою работу?
Некоторые из вас могут подумать, что эта тема является дубликатом предыдущих тем, таких как перечисленные в нижней части этого поста, но это не так. Эти темы обсуждаются только теоретически,но ни один из них не дает ни одного примера, демонстрирующего Почемуreintepret_cast
действительно нужно, идва static_cast
было быконечно провал. Я согласен, один static_cast потерпит неудачу. Но как насчет двух?
Если синтаксис двух цепочекstatic_cast
выглядит громоздким, тогда мы можем написать шаблон функции, чтобы сделать его более удобным для программистов:
template<class To, class From>
To any_cast(From v)
{
return static_cast<To>(static_cast<void*>(v));
}
И тогда мы можем использовать это, как:
char *buffer = any_cast<char*>(&a); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
//convert back
A *pA = any_cast<A*>(buffer); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
Также посмотрите эту ситуацию, когдаany_cast
может быть полезно:Правильное приведение для функций чтения и записи fstream.
Так что мой вопрос в основном таков:
Почему у насreinterpret_cast
в С ++?Пожалуйста, покажите мне хотя бы один пример, гдес двумя цепями static_cast
наверняка не сможет сделать ту же работу?Какой актерский состав использовать; static_cast или reinterpret_cast?Приведение из Void * в TYPE *: static_cast или reinterpret_cast