繁体   English   中英

std :: map是否要求比较器的operator()为const?

[英]Does std::map require the comparator's operator() to be const?

在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&left,const Foo&right){

如果我关闭libc ++并使用libstdc ++进行构建,那么一切都很好。 显然,我可以通过使FooComparator :: operator()成为const来解决此问题,但是我想了解这是libc ++过于严格还是标准(C ++ 03和C ++ 11都存在)的问题。 )实际上确实要求比较器的operator()为const(在这种情况下,它与libstdc ++一起使用是很不幸的事情)。

好吧,是的:比较器是映射本身的子对象,以一种方式或另一种方式(可能是成员;通常是某个内部实现类的基类)。 如果您对映射有恒定的引用,则比较器仍需要可用于查找,因此运算符必须为const

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM