2011-01-20 2 views
5

Dans le C++ Sans Peur: Guide du débutant qui vous fait sentir intelligent livre, et dans le chapitre (8), il mentionne ce qui suit à propos reinterpret_castreinterpret_cast

.... convertis d'un type de pointeur (int) à un autre (char *). Étant donné que la distribution modifie la façon dont les données pointées sont interprétées, elle est appelée reinterpret_cast, par opposition à static_cast. *

Pouvez-vous décrire ce paragraphe ici? Surtout la raison de la façon dont l'opération est nommée?

Merci.

+3

C'est un super nom pour un livre! – Joe

+0

Il y avait une autre question aujourd'hui qui est sorti de ce livre, et il a fini par faire n'importe quoi mais rendre l'OP intelligent. –

+0

Ah, c'est toi. http://stackoverflow.com/questions/4746980/c-quitting-a-program Dommage que tu aies choisi de ne pas suivre mon conseil pour en avoir un vrai. –

Répondre

6

Fondamentalement, le reinterpret_cast réinterprète le modèle de bits à un emplacement spécifique en tant que type différent.

Voir par exemple ici: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

« L'opérateur reinterpret_cast produit une valeur d'un nouveau type qui a la même configuration binaire comme argument. » La conversion statique convertit l'argument au lieu de simplement le réinterpréter. Vous pouvez essayer ceci par static_casting et int pour flotter et réinterpréter_casting un int pour flotter. Le résultat sera totalement différent.

+3

Il n'a pas nécessairement le même modèle de bits. Il y a très peu de garanties sur 'reinterpret_cast' dans la norme. 5.2.10/3 dit "Le mappage effectué par' reinterpret_cast' est défini par l'implémentation. [Note: il pourrait ou non produire une représentation différente de la valeur originale.] "De plus, un' reinterpret_cast' ne peut pas lancer '' int' à un 'float' (il peut lancer' int * 'à' float * '). Toute implémentation qui fait cette distribution est en violation de la norme (5.2.10/1, dernière phrase), bien que ce soit probablement une extension assez courante. –

4

Il n'y a rien de fantaisie ici. c'est vraiment juste destiné à réinterpréter quelque chose.

Du standard 5.3.10, reinterpret_cast vise à répondre les cas suivants:

  • Un pointeur peut être converti explicitement à un assez grand type intégral pour le maintenir.
  • Une valeur de type intégral ou type d'énumération peut être explicitement convertie en pointeur.
  • Un pointeur sur une fonction peut être explicitement converti en un pointeur vers une fonction de type différent.
  • Un pointeur vers un objet peut être explicitement converti en un pointeur vers un type d'objet différent.
  • La conversion d'un pointeur vers une fonction en un pointeur vers un type d'objet ou inversement est prise en charge de manière conditionnelle.
  • La valeur du pointeur NULL (4.10) est convertie en la valeur du pointeur NULL du type de destination. Une prvalue de type "pointeur vers un membre de X de type T1" peut être explicitement convertie en une prvalue d'un type différent "pointeur sur membre de Y de type T2" ​​si T1 et T2 sont tous deux des types de fonction ou les deux .
  • Une expression lvalue de type T1 peut être convertie en type "référence à T2" si une expression de type "pointeur vers T1" peut être explicitement convertie en type "pointeur vers T2" en utilisant reinterpret_cast. Autrement dit, une coulée de référence reinterpret_cast < T &> (x) a le même effet que la conversion * reinterpret_cast < T *> (& x) avec les opérateurs intégrés & et * (et de même pour reinterpret_cast < T & &> (X)).
+0

Vous avez fait une erreur - c'est le paragraphe 5.2.10 en standard (vous avez écrit 5.3.10) –

+0

Les numéros ne sont-ils pas autorisés à changer de révision en révision, btw? :) – Kos

Questions connexes