无法将std :: unorded_set与自定义KeyEqual进行比较

Xia*_*Pei 8 c++ unordered-set c++11

以下程序无法编译.但如果我不评论operator==,它会编译.operator==我已经提供的时候仍然需要为什么FooEqual

#include <cstddef>
#include <unordered_set>

struct Foo {
};

struct FooHasher {
  size_t operator()(const Foo&) const {
    return 1;
  }
};

struct FooEqual {
  bool operator()(const Foo& lhs, const Foo& rhs) const {
    return true;
  }
};

// bool operator==(const Foo& lhs, const Foo& rhs) {
//   return true;
// }

int main() {
  std::unordered_set<Foo, FooHasher, FooEqual> s1;
  std::unordered_set<Foo, FooHasher, FooEqual> s2;
  (void)(s1 == s2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 3

“23.2.5 无序关联容器”指出:

如果 a.size() == b.size() ,两个无序容器 a 和 b 比较相等,并且对于从 a.equal_range(Ea1) 获得的每个 equal=key 组 [Ea1,Ea2),存在一个 equal-key 组[Eb1,Eb2) 从 b.equal_range(Ea1) 获得,使得 distance(Ea1, Ea2) == distance(Eb1, Eb2) 且 is_permutation(Ea1, Ea2, Eb1) 返回 true。

剥离这一点,这一切都归结为根据 定义的无序容器的相等性std::is_permutation()

重要的是,它引用了std::is_permutation() 的三参数形式,而不是四参数形式!

换句话说,operator==对于无序容器的内容,整个纸牌屋最终都被还原为默认值,而不是容器的官方比较功能。

这就是我对此的解读。