Considere el siguiente fragmento:Acorralado por const: std :: Mapa :: find() const sobrecargue
#include <map>
class C {
public:
C() {}
const int& f(const int& x) const
{
// Error: cannot cast const int* to int* const
return myMap.find(&x)->second;
// With a const_cast works:
//return myMap.find(const_cast<int* const>(&x))->second;
}
std::map<int*, int> myMap;
};
int _tmain(int argc, _TCHAR* argv[])
{
int x = 0;
C c;
c.f(x);
return 0;
}
El error en f()
es causada por la sobrecarga de const del mapa de find()
tomar una const KeyType&
. Como el tipo de clave del mapa es int*
, esto se convierte en int* const
. f()
toma un parámetro const int&
, que es correcto porque el parámetro nunca se modifica.
Desafortunadamente, esto termina tratando de lanzar un const int*
a un int* const
, que pierde el calificador const en el int y no se compilará.
Esto es un poco irritante porque el parámetro definitivamente no se modifica alguna vez - solo se usa para un find() - pero aún necesito const_cast
.
¿Hay alguna manera de escribir f()
sin const_cast
?
Esto es bastante inusual: ¿por qué está utilizando punteros como claves de mapa? –
En mis aplicaciones, las claves deben ser referencias a objetos pesados, y no puede usar una referencia como clave de mapa. – AshleysBrain