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