Почему нельзя сопоставить :: найти указатель на const? - PullRequest
1 голос
/ 10 июля 2019

кратко, почему не компилируется

#include <map>
int main()
{
    std::map<int*, char> m;
    const int *x = nullptr;
    m.find(x);
}

Что может быть причиной того, что этот код не является допустимым?

Почему для * 1006 имеет значение, является ли это указателем или указателем на const ??

выглядит и пахнет как жук ...

И нет, спасибо, нет const_cast

Ответы [ 2 ]

3 голосов
/ 11 июля 2019

выглядит и пахнет как ошибка ...

Почему это будет ошибка?

Параметр find является константной ссылкой на ключtype (постоянная ссылка на int *).

Нельзя связать const int * с такой ссылкой, поскольку const int * не может быть неявно преобразовано в int *.


Начиная с C ++ 14, вы могли бы исправить это с помощью прозрачного компаратора: std::map<int*, char, std::less<>>.

С прозрачным компаратором find становится шаблоном.Он будет работать с любым типом параметра, если его можно сравнить с типом ключа.

2 голосов
/ 11 июля 2019

Версия по умолчанию std::map<int*, char> использует less<int*> в качестве компаратора, который, в свою очередь, имеет определенную функцию ()(const int*, const int*).

Эта функция не будет принимать int*

Однако, если вы используете less<>, он будет работать:

std::map<int*, char, std::less<>> m;

Причина этого в том, что std::less<void> определяет функцию шаблона,

template< class T, class U>
constexpr auto operator()( T&& lhs, U&& rhs ) const

И это работает простохорошо, когда сравниваются константные и неконстантные указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...