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;
}

エラー:

壊れた.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 に答える