为什么不能映射:::指向const的指针?

时间:2019-07-10 20:48:38

标签: c++ stl

简而言之,为什么不编译

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

那不是有效的代码可能是什么原因?

find是指针还是指向const的指针为什么重要?

看起来和闻起来像个虫子...

不用了,谢谢const_cast

2 个答案:

答案 0 :(得分:3)

  

看起来和闻起来像个虫子...

为什么会是错误?

find的参数是对键类型的const引用(对int *的const引用)。

您不能将const int *绑定到这样的引用,因为const int *不能隐式转换为int *


自C ++ 14起,您可以使用透明比较器来解决此问题:std::map<int*, char, std::less<>>

使用透明的协同映射器,find成为模板。只要可以与键类型进行比较,它就可以与任何参数类型一起使用。

答案 1 :(得分:2)

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

当比较const指针和非const指针时,这很好用。