Por que temos reinterpret_cast em C ++ quando dois static_cast encadeados podem fazer seu trabalho?

Diga que eu quero transmitirA* parachar* e vice-versa, temos duas opções (quero dizer, muitos de nós pensam que temos duas opções,Porque ambos parecem funcionar! Daí a confusão!):

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

Ambos funcionam bem.

//convert back
A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2

Mesmo isso funciona bem!

Então, por que nós temosreinterpret_cast em C ++ quandodois acorrentados static_cast pode fazer o seu trabalho?

Alguns de vocês podem pensar que este tópico é uma duplicata dos tópicos anteriores, como os listados na parte inferior desta postagem, mas não é. Esses tópicos discutem apenas teoricamente,mas nenhum deles dá um único exemplo demonstrando porquereintepret_cast é realmente necessário, edois static_cast seriacertamente falhou. Eu concordo, um static_cast falharia. Mas que tal duas?

Se a sintaxe de dois encadeadosstatic_cast parece complicado, então podemos escrever um modelo de função para torná-lo mais amigável ao programador:

template<class To, class From>
To any_cast(From v)
{
    return static_cast<To>(static_cast<void*>(v));
}

E então podemos usar isso, como:

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

Além disso, veja esta situação em queany_cast pode ser útil:Transmissão adequada para funções de membro de leitura e gravação fstream.

Então, minha pergunta é basicamente,

Por que nós temosreinterpret_cast em C ++?Por favor, mostre-me até um único exemplo em quedois acorrentados static_cast certamente falharia em fazer o mesmo trabalho?Qual elenco usar; static_cast ou reinterpret_cast?Transmitir de Void * para TYPE *: static_cast ou reinterpret_cast

questionAnswers(7)

yourAnswerToTheQuestion