是否性病::地图需要比较的运算符()为const?(Does std::map require th

2019-07-03 11:26发布

下面的代码失败在OS X 10.8的libc使用时++用的XCode 4.5的铛编译++:

#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:注:候选函数不可行: '这个' 参数的类型为 'const的FooComparator',但方法没有被标记const的布尔运算符()(常量富&左,常量的Foo,右){

如果我关闭的libc ++与建设的libstdc ++就万事大吉了。 很显然,我可以解决此通过使FooComparator ::运算符()const的,但我想知道这是否是一个的libc ++的问题过于严格,或是否标准(包括C ++ 03和C ++ 11 )是否确实需要比较的运算符()const的(在这种情况下,它的工作原理与的libstdc事实++是一个快乐的事故)。

Answer 1:

嗯,是:比较是在地图本身,这种或那种方式的子对象(可能是部件;通常是基类中的一些内实现类的)。 如果你有一个恒定的参考地图,比较仍然需要进行查找可用的,所以运营商需要为const



文章来源: Does std::map require the comparator's operator() to be const?
标签: c++ libc++