次のコードは、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++ で動作するという事実は幸運な事故です)。