Duplicata possible:
Quand faut-il utiliser static_cast, dynamic_cast et reinterpret_cast?
J'utilise la fonction c en c ++, où une structure passée comme argument de type void en c est directement stockée ce même type de structure.
par exemple en C.
void getdata(void *data){
Testitem *ti=data;//Testitem is of struct type.
}
pour faire de même en c ++ j'utilise static_cast:
void foo::getdata(void *data){
Testitem *ti = static_cast<Testitem*>(data);
}
et quand j'utilise reinterpret_cast
il fait le même travail, en moulant la structure
quand j'utilise Testitem *it=(Testitem *)data;
cela fait la même chose aussi. Mais comment la structure est-elle affectée en utilisant les trois.
UNE static_cast
est un casting d'un type à un autre qui (intuitivement) est un casting qui pourrait dans certaines circonstances réussir et avoir du sens en l'absence d'un casting dangereux. Par exemple, vous pouvez static_cast
une void*
à un int*
, puisque le void*
pourrait en fait pointer vers un int*
, ou un int
en char
, car une telle conversion est significative. Cependant, vous ne pouvez pas static_cast
un int*
à un double*
, car cette conversion n'a de sens que si le int*
a été en quelque sorte modifié pour pointer sur un double*
.
UNE reinterpret_cast
est un transtypage qui représente une conversion non sécurisée qui pourrait réinterpréter les bits d'une valeur comme les bits d'une autre valeur. Par exemple, la conversion d'un int*
à un double*
est légal avec un reinterpret_cast
, bien que le résultat ne soit pas spécifié. De même, la conversion d'un int
en void*
est parfaitement légal avec reinterpret_cast
, bien que ce ne soit pas sûr.
Ni static_cast
ni reinterpret_cast
peut supprimer const
de quelque chose. Vous ne pouvez pas lancer un const int*
à un int*
en utilisant l'un de ces modèles. Pour cela, vous utiliseriez un const_cast
.
Une distribution de style C de la forme (T)
est défini comme essayant de faire un static_cast
si possible, se replier sur un reinterpret_cast
si cela ne fonctionne pas. Il appliquera également un const_cast
si c'est absolument le cas.
En général, vous devriez toujours préférer static_cast
pour les lancers qui devraient être sûrs. Si vous essayez accidentellement de faire un cast qui n'est pas bien défini, le compilateur signalera une erreur. Seule utilisation reinterpret_cast
si ce que vous faites est en train de changer l'interprétation de certains bits de la machine, et n'utilisez un cast de style C que si vous êtes prêt à risquer de faire un reinterpret_cast
. Pour votre cas, vous devez utiliser le static_cast
, depuis la descente du void*
est bien défini dans certaines circonstances.