¿Es posible "constificar" un campo de `std :: pair` sin hacks?
En C ++, compila el siguiente código:
std::pair <int, int> x;
static_cast <std::pair <const int, int>*> (&x);
da un error:
error: invalid static_cast from type ‘std::pair<int, int>*’ to type ‘std::pair<const int, int>*’
Entiendo más o menos por qué sucede, ya que la calificación cv de un tipo en una lista de parámetros de plantilla puede, en principio, dar un resultado "incompatible". E incluso si en este caso no lo hace, el compilador no tiene forma de saberlo.
De todas formas,¿Hay alguna manera no hackea de realizar esta conversión?? Soy cuidadoso de usarreinterpret_cast
para nada como he estado por problemas de puntería antes. Además, no puedo usar temporarios ya que esto está en código de rendimiento crítico.
EDITAR:
Esto es lo que estoy haciendo. Estoy implementando una interfaz de contenedor personalizada compatible constd::unordered_map
. Por eso, esvalue_type
necesita ser unpair <const key_type, mapped_type>
. Para alguna optimización, necesitointernamente almacenar los valores comopair <key_type, mapped_type>
, sinconst
. Sin embargo, si hago eso, no puedo (sinreinterpret_cast
) implementan iteradores sobre el contenedor, ya que necesitan devolver referencias a valores y solo tengo referencias a estos pares no constantes.