在OS X 10.8上使用libc ++时,以下代码无法使用XCode 4.5的clang ++进行编译:
#include <map>
#include <string>
class Foo {
public:
explicit Foo(int val_) : val(val_) {}
int val;
};
struct FooComparator {
bool operator()(const Foo& left, const Foo& right) {
return left.val < right.val;
}
};
int main(int argc, char* argv[]) {
std::map<Foo, std::string, FooComparator> m;
Foo f(4);
m[f] = std::string("four");
return 0;
}
错误:
broken.cpp:11:8:注意:候选函数不可行:'this'这个论点 有'const FooComparator'类型,但是 方法没有标记为const bool operator()(const Foo&amp; left,const Foo&amp; right){
如果我关闭libc ++并使用libstdc ++构建,那么一切都很顺利。显然,我可以通过制作FooComparator :: operator()const来解决这个问题,但是我想知道这是否是libc ++过于严格的问题,还是标准(C ++ 03和C ++ 11)确实要求比较器的operator()是const(在这种情况下,它与libstdc ++一起工作的事实是一件幸事)。
答案 0 :(得分:19)
嗯,是的:比较器是地图本身的一个子对象,不管是哪种方式(可能是成员;通常是某个内部实现类的基类)。如果你有一个对映射的恒定引用,比较器仍然需要可用于查找,因此运算符需要const
。