La gravedad de un yeso depende típicamente del tipo de yeso. Existen usos legítimos para todos estos moldes, pero algunos huelen peor que otros.
const_cast
se utiliza para descartar const
ness (ya que no necesita escayolar). Idealmente, eso nunca debería ser usado. Hace que sea fácil invocar un comportamiento indefinido (tratando de cambiar un objeto originalmente designado como const
) y, en cualquier caso, rompe el const
-corrección del programa. A veces es necesario cuando se interactúa con API que no son en sí mismas const
-correcta, que pueden, por ejemplo, pedir un char *
cuando van a tratarlo como const char *
, pero dado que no debería escribir API de esa manera, es una señal de que está usando una API realmente vieja o alguien está jodido.
reinterpret_cast
siempre dependerá de la plataforma y, por lo tanto, es cuestionable en el código portátil. Además, a menos que esté haciendo operaciones de bajo nivel en la estructura física de los objetos, no preserva el significado. En C y C++, se supone que un tipo es significativo. Un int
es un número que significa algo; un int
que es básicamente la concatenación de char
s realmente no significa nada.
dynamic_cast
se utiliza normalmente para downcasting; p.ej. desde Base *
hasta Derived *
, con la condición de que o bien funciona o devuelve 0. Esto subvierte OO de forma muy similar a como lo hace una declaración switch
en una etiqueta de tipo: mueve el código que define qué clase está fuera de la definición de clase . Esto combina las definiciones de clase con otro código y aumenta la carga de mantenimiento potencial.
static_cast
se utiliza para las conversiones de datos que generalmente se consideran correctas, como las conversiones ay desde void *
, conocidos bloqueos de punteros seguros dentro de la jerarquía de clases, ese tipo de cosas. Lo peor que puedes decir es que subvierte el sistema de tipo hasta cierto punto. Es probable que sea necesario cuando se hace interfaz con bibliotecas C, o la parte C de la biblioteca estándar, ya que void *
se usa a menudo en funciones C.
En general, código C++ bien diseñado y bien escrito evitará los casos de uso anteriores, en algunos casos porque el único uso del molde es hacer cosas potencialmente peligrosas, y en otros casos porque dicho código tiende a evitar la necesidad de tales conversiones. El sistema de tipo C++ generalmente se considera como algo bueno de mantener, y lo convierte en subversivo.
Estoy de acuerdo con el comentario final de sharptooth aquí, el hecho de que tengas un elenco explícito no significa que tengas un código incorrecto, pero si estás lanzando hacia atrás y hacia delante cada dos líneas, entonces necesitas replantear las cosas. Casting es una operación válida, pero es algo que no debería usarse en exceso. –
¡Ciertamente nunca solía arrojar advertencias y errores de compilación! – Alan