Comment peut-static_cast pouvez convertir un int en char, mais pas reinterpret_cast?
Je ne suis pas sûr si elle a été posée tout à l'heure, mais doit avoir été je crois. Considérons la ligne simple pour le début de la question :
int a ;
char b = reinterpret_cast<char> (a);
Je comprends reinterpret_cast
interpréter le motif de bits de type x type y, ofcouse il ne devrait pas travailler en raison d'incompatibilité de taille et en effet il n'est pas.
Considérons maintenant ce un autre code:
int a ;
char b = static_cast<char> (a);
Cela fonctionne! . Maintenant, ma question est de savoir comment cela peut fonctionner ? Je veux dire ne le compilateur côtelettes de désactiver les bits? . Je suis certain sizeof(char) < sizeof(int)
. Si, reinterpret_cast
devrait également fonctionner en même technique ?
Vous devez vous connecter pour publier un commentaire.
Il est bien définie de la conversion de
int
àchar
; c'est ce questatic_cast
n'. En fait, vous n'avez pas besoin de la fonte; vous pouvez simplement utiliser une assignation ici. D'autre part,reinterpret_cast
dit de prétendre que les bits dans un objet d'un type de représenter un objet d'un autre type; pour certains types de problème (plus ou moins), mais il n'y a pas de meilleure façon de prétendre que les bits dans un int peut être utilisé comme les bits dans un char sans l'application d'une conversion, etreinterpret_cast
ne pas le faire.reinterpret_cast
ne pas le faire". la partie de la spec dit cela?reinterpret_cast
, évidemment, où vous attendez-vous à dire? [expr.réinterpréter.distribution] "les Conversions peuvent être effectuées de manière explicite à l'aidereinterpret_cast
sont énumérés ci-dessous. Aucune autre conversion peut être effectuée de manière explicite à l'aidereinterpret_cast
."reinterpret_cast
est assez limité. Comme @JonathanWakely le souligne, il y a une liste de choses qu'il peut faire (en gros les choses impliquant des pointeurs et les références) et rien d'autre n'est autorisé. 5.2.10 [expr.réinterpréter.distribution]. Pas du tout comme un style C cast...static_cast pouvez forcer une conversion définie pour arriver ou il peut inverser la conversion définie (autres que pour l'ajout ou la suppression const/volatils). Vous pensez que reinterpret_cast est un super cast qui peut tout faire. Ce n'est pas le cas. Il a une série de conversions définies par l'.
Il peut convertir des pointeurs de même type d'un pointeur d'un autre (tant que const/volatile est conservé). Il peut même le faire pour les références. Il peut lancer des pointeurs vers les types intégraux et vice versa.
Autre que cela, il ne fait rien et que votre programme n'est pas bien formé.