为什么类内定义的operator==无法适配unordered_set编译要求?
问题分析:结构体A的operator==为何无法被unordered_set使用?
以下代码无法编译,但取消注释全局的
bool operator==函数后即可正常编译运行。为何结构体A中定义的成员operator==无法覆盖该场景?是代码错误还是合理现象?
#include <iostream> #include <unordered_set> using std::cout; using std::string; struct A { string data; A (const char* str) { this->data = str; } bool operator== (const A& obj) { return this->data == obj.data; } }; //bool operator==(const A& lhs, const A& rhs) { // return lhs == rhs; //} template<> struct std::hash<A> { std::size_t operator()(A const& s) const noexcept { std::size_t h1 = std::hash<string>{}(s.data); return h1; } }; int main() { std::unordered_set<A> circles; A c1("a"); A c2("b"); circles.insert(c1); circles.insert(c2); return 0; }
原因解析
这是合理现象,核心问题出在成员版operator==的const修饰缺失:
- 成员函数
bool operator==(const A& obj)本质上隐含了一个非const的this指针,也就是说这个函数只能被非const的A对象调用。 - 而
std::unordered_set在内部比较元素时,会把元素当作const对象处理(容器内未被修改的元素默认是const属性,内部实现也会用const引用传递参数),此时它需要调用的是支持const对象的operator==,你的成员函数不满足这个要求,编译器找不到匹配的重载,自然编译失败。
全局版能运行的原因
全局的bool operator==(const A& lhs, const A& rhs)两个参数都是const引用,不管传入的是const还是非const对象都能匹配,编译器可以找到这个重载,因此编译通过。
无需全局函数的修正方案
给成员版operator==加上const修饰,让它支持const对象调用即可:
bool operator== (const A& obj) const { return this->data == obj.data; }
内容的提问来源于stack exchange,提问作者Starodub_A_V
相关产品推荐
相关产品推荐

