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)
“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==对于无序容器的内容,整个纸牌屋最终都被还原为默认值,而不是容器的官方比较功能。
这就是我对此的解读。