Загнано в угол const: std :: map :: find () const overload

Рассмотрим следующий фрагмент:

#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;
}

Ошибка в f () вызвана перегрузкой константы find () карты, принимающей const KeyType & . Поскольку ключевой тип карты - int * , это превращается в int * const . f () принимает параметр const int & , что является правильным, потому что параметр никогда не изменяется.

К сожалению, это заканчивается попыткой преобразовать const int * в int * const , который теряет квалификатор const для int и не компилируется.

Это немного раздражает, потому что параметр определенно никогда не изменяется - он ' s просто используется для find () - но мне все еще нужно const_cast it.

Есть ли способ записать f () без const_cast ?

5
задан AshleysBrain 30 April 2011 в 23:06
поделиться