У вас может быть проблема с правильностью.const int *
может быть не тем, что вы думаете .Это указатель на константу целое число .Это не то же самое, что тип ключа вашей карты, который является указателем на (непостоянное) целое число .И ни то, ни другое не совпадает с int * const
, который является константным указателем на (непостоянное) целое число .Вопрос не в том, является ли само значение ключа изменчивым или неизменным, а в том, являются ли изменяемые или неизменяемые объекты, на которые вы храните указатели,
Например, такими компиляциями:
std::map<int *, double> mymap;
double myfind(int * const mykey) {
return mymap.find(mykey)->second;
}
Как это сделать:
std::map<const int *, double> mymap;
double myfind(const int *mykey) {
return mymap.find(mykey)->second;
}
double myfind2(const int * const mykey) {
return mymap.find(mykey)->second;
}
Вы видите разницу?В вашем исходном коде компилятор совершенно правильно отмечает ошибку.Если ваша функция принимает const int *
, то вы фактически обещаете не изменять int
, на который указывает указатель, который я передаю. Но если вы используете такой указатель, как int *
в ключе std::map
, вы можете позволить кому-то изменить это int
.
В этом конкретном случае мы знаем, что std::map::find()
не будет назначать аргумент-указатель, но компилятор этого не делает, поэтому const_cast<>
существует, как указано в других ответах.