Avatar ·

Cuándo usar static_cast, dynamic_cast, const_cast y reinterpret_cast en C++?

¡Hola! Acabo de empezar a aprender C++ y no puedo entender las conversiones de tipos. Parece que hay cuatro operadores diferentes: static_cast, dynamic_cast, const_cast y reinterpret_cast. Pero cuándo usar cuál es un completo lío. Por ejemplo, quiero convertir un double a int. ¿No puedo simplemente escribir (int)value, como en C? ¿Para qué sirve static_cast? O esta situación: tengo una jerarquía de clases y quiero convertir un puntero a clase base en un puntero a clase derivada. He oído que para eso se usa dynamic_cast, pero solo funciona con funciones virtuales. ¿Y si no las hay? ¿Puedo usar static_cast? También me confunde const_cast. Sé que puede "eliminar" la constancia. Pero ¿no es peligroso? ¿Y para qué podría necesitar modificar un objeto constante? Y lo más aterrador: reinterpret_cast. He leído que puede convertir cualquier puntero en cualquier otro, incluso en int. ¿Es eso legal? ¿Cuándo podría ser útil? Aquí hay un ejemplo de código que no me compila.