tipos - try on c++
static_cast<int>(foo) vs.(int) foo (3)
(int) foo se compara más a c ++ reinterpret_cast<int>
, es decir, no verifica la validez del elenco.
¿Podría alguien explicar las diferencias?
La diferencia es que (int) foo puede significar media docena de cosas diferentes. Puede ser un static_cast (conversión entre tipos conocidos de forma estática), puede ser un const_cast (agregar o eliminar const-ness), o podría ser un reinterpret_cast (conversión entre tipos de puntero)
El compilador prueba 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 en.
Mire lo que Stroustrup tiene que decir al respecto , incluidos los siguientes:
Debido a que el elenco de estilo C (T) se puede usar para expresar muchas operaciones lógicamente diferentes, el compilador tiene la menor posibilidad de atrapar los usos indebidos. [...]
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 menos propensas a generar errores que las 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.