Рассмотрим следующий фрагмент:
#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
?