Использование литья в стиле 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

Ответы на вопрос(7)

Ваш ответ на вопрос