2011-01-20 995 views
5

En el C++ sin miedo: una guía para principiantes que te hace sentir inteligente libro, y en el capítulo (8), que menciona lo siguiente acerca de reinterpret_castreinterpret_cast

.... conversos de un tipo de puntero (int) a otro (char *). Como el reparto cambia de la manera en que se interpretan los datos, se lo denomina reinterpret_cast, en lugar de static_cast. *

¿Puede describir este párrafo aquí? ¿Especialmente la razón de la forma en que se llama la operación?

Gracias.

+3

¡Ese es un gran nombre para un libro! – Joe

+0

Hubo otra pregunta hoy que salió de este libro, y terminó haciendo cualquier cosa menos hacer que OP se sintiera inteligente. –

+0

Ah, ja, fue usted. http://stackoverflow.com/questions/4746980/c-quitting-a-program Es una pena que haya optado por no seguir mi consejo sobre cómo obtener uno real. –

Respuesta

6

Básicamente, reinterpret_cast reinterpreta el patrón de bits en una ubicación específica como un tipo diferente.

Véase, por ejemplo aquí: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

"El operador reinterpret_cast produce un valor de un nuevo tipo que tiene el mismo patrón de bits como su argumento."

La conversión estática convierte el argumento en lugar de simplemente reinterpretarlo. Puedes probar esto mediante static_casting e int para flotar y reinterpretar_casting un int para flotar. El resultado será totalmente diferente.

+3

No tiene necesariamente el mismo patrón de bits. Hay muy pocas garantías en 'reinterpret_cast' en el estándar. 5.2.10/3 dice "El mapeo realizado por' reinterpret_cast' está definido por la implementación. [Nota: puede, o no, producir una representación diferente del valor original.] "Además, un' reinterpret_cast' no puede emitir un ' int' a un 'float' (puede convertir' int * 'en' float * '). Cualquier implementación que haga ese lanzamiento infringe el Estándar (5.2.10/1, última oración), aunque es probable que sea una extensión bastante común. –

4

No hay nada especial aquí. en realidad solo tiene la intención de reinterpretar algo.

De norma 5.3.10, reinterpret_cast está dirigido a atender los siguientes casos:

  • Un puntero se puede convertir explícitamente a cualquier tipo integral lo suficientemente grande como para sostenerlo.
  • Un valor de tipo integral o tipo de enumeración puede convertirse explícitamente en un puntero.
  • Un puntero a una función se puede convertir explícitamente en un puntero a una función de un tipo diferente.
  • Un puntero a un objeto se puede convertir explícitamente en un puntero a un tipo de objeto diferente.
  • Condicionalmente se admite la conversión de un puntero a una función en un puntero a un tipo de objeto o viceversa.
  • El valor del puntero nulo (4.10) se convierte al valor del puntero nulo del tipo de destino.
  • Un prvalue de tipo "puntero a miembro de X de tipo T1" se puede convertir explícitamente en un prvalue de un tipo diferente "puntero a miembro de Y de tipo T2" si T1 y T2 son ambos tipos de función o ambos tipos de objeto .
  • Una expresión lvalue de tipo T1 se puede convertir al tipo "referencia a T2" si una expresión de tipo "puntero a T1" se puede convertir explícitamente al tipo "puntero a T2" utilizando reinterpret_cast. Es decir, un reparto de referencia reinterpret_cast < T &> (x) tiene el mismo efecto que la conversión * reinterpret_cast < T *> (& x) con los operadores internos & y * (y lo mismo para reinterpret_cast < T & &> (X)).
+0

Cometió un error: es el párrafo 5.2.10 en estándar (escribió 5.3.10) –

+0

¿No se permite que los números cambien de revisión a revisión, por cierto? :) – Kos

Cuestiones relacionadas