2009-01-24 12 views

Respuesta

23

La diferencia es que (int) foo puede significar media docena de cosas diferentes. que podría ser una static_cast (convertir entre tipos estáticamente conocidos), que podría ser una const_cast (adición o eliminación de const-dad), o podría ser un reinterpret_cast (conversión entre tipos de puntero)

El compilador trata cada uno de ellos hasta que encuentre uno que funcione. Lo que significa que puede que no siempre elija el que espera, por lo que puede convertirse en una fuente sutil de errores.

Además, static_cast es mucho más fácil de buscar o buscar/reemplazar.

+0

Gracias por la respuesta clara y concisa. +1. –

+0

Los moldes de estilo C no pueden hacer downcasting "seguro" como dynamic_cast, solo downcasting "inseguro" como static_cast. – bk1e

+0

Además, pongo "seguro" y "inseguro" entre comillas porque nada en C++ es realmente seguro. – bk1e

0

(int) foo se compara más a C++ reinterpret_cast<int>, es decir, no se verifica la validez del elenco.

+0

http://www.velocityreviews.com/forums/t280611-reinterpretcastltgt-v-staticcastltgt.html expanins la diferencia entre static_cast y reinterpret_cast –

+0

No, se compara con una combinación de todas las versiones de C++. Realizará el primer tipo de lanzamiento que sea válido. – jalf

+0

Es cierto, excepto que dynamic_cast no está incluido. –

7

Mira lo Stroustrup has to say about that, incluyendo las siguientes:

Debido a que la conversión de estilo C (T) se puede utilizar para expresar muchas operaciones diferentes, lógicamente, el compilador sólo tiene la oportunidad de atrapar los malos usos más pelado. [...]

Los "modelos nuevos" se introdujeron para dar a los programadores la oportunidad de expresar sus intenciones con mayor claridad y para que el compilador capte más errores. [...]

En particular, C++ hace la distinción entre static_cast y reinterpret_cast:

La idea es que las conversiones permitidas por static_cast son algo menos probable que conduzca a errores que los que requieren reinterpret_cast . En principio, es posible usar el resultado de un static_cast sin devolverlo a su tipo original, mientras que siempre debe convertir el resultado de un reinterpret_cast a su tipo original antes de usarlo para garantizar la portabilidad.

Cuestiones relacionadas