15

在 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++ 一起工作的事实是一个幸运的意外)。

4

1 回答 1

20

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

于 2012-10-30T22:36:27.023 回答