2011-04-30 8 views
5

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?

+1

Esto es bastante inusual: ¿por qué está utilizando punteros como claves de mapa? –

+0

En mis aplicaciones, las claves deben ser referencias a objetos pesados, y no puede usar una referencia como clave de mapa. – AshleysBrain

Respuesta

5

La verdadera pregunta es: ¿por qué no es el índice del mapa un puntero para const? (Suponiendo, por supuesto, que debe ser un puntero.) ¿Realmente desea poder modificar el índice a través de algo como *myMap.find(&x)->first = xxx; Diría que eso es bastante inusual, dado que ya tiene un puntero al objeto .

+0

Ah, no pensé en eso - ¡gracias! – AshleysBrain

7

Puede simplemente cambiar el tipo de map a ; Sin embargo, me pregunto si necesitas punteros como llaves en primer lugar. Como James señala, el tipo de clave debe ser const int* porque nunca tiene la intención de modificar el referente a través del map. Si lo hicieras, estaría aún más preocupado.

Cuestiones relacionadas