简而言之,为什么不编译
#include <map>
int main()
{
std::map<int*, char> m;
const int *x = nullptr;
m.find(x);
}
那不是有效的代码可能是什么原因?
find
是指针还是指向const的指针为什么重要?
看起来和闻起来像个虫子...
不用了,谢谢const_cast
答案 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指针时,这很好用。