web-dev-qa-db-fra.com

Quelle est la différence entre static_cast et reinterpret_cast?

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.

48
HariHaraSudhan

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.

108
templatetypedef