El operador const_cast de C++ arrastra mala fama por resultar feo y por abrir la puerta a comportamientos indefinidos cuando se usa mal. Sin embargo, en el estándar del lenguaje existen situaciones concretas en las que no hay otra alternativa legítima, y la más conocida aparece al trabajar con std::priority_queue.
A diferencia de std::stack o std::queue, cuya función top devuelve una referencia mutable, priority_queue devuelve una referencia a constante. El motivo es que esta cola de prioridad debe preservar el invariante de heap: si se permitiera modificar los elementos internos, un usuario podría romper ese invariante. El método pop devuelve void, lo que impide extraer un elemento a través de él.
Para sacar objetos move-only del contenedor, la única vía es tomar la referencia constante que ofrece top, aplicar const_cast para eliminar el const, mover el objeto fuera del contenedor y llamar acto seguido a pop para restablecer el invariante. El patrón es: const T& obj = q.top(); T exfiltrated_obj = std::move(const_cast(obj)); q.pop();.
El autor recuerda que este comportamiento roto data de C++11 y que los adaptadores de contenedores reciben poca atención en el estándar. Mientras tanto, const_cast sigue siendo la herramienta necesaria, aunque incómoda, para casos como este.
