自定义std::set比较器触发is_invocable错误的原因与解决方法
问题分析与解决方案
错误含义解析
编译错误的核心原因是:std::set的find方法执行时,会以const引用的方式使用自定义比较器对象。而你定义的hash_comparator::operator()不是const成员函数,C++不允许通过const对象调用非const成员函数,这直接导致std::is_invocable_v<const hash_comparator&, unsigned char* const&, unsigned char* const&>返回false,触发静态断言失败。
修改方案
只需将hash_comparator中的operator()声明为const成员函数,让它能被const引用的比较器对象调用即可:
typedef unsigned char uchar; struct hash_comparator { // 添加const修饰符,确保该运算符可被const对象调用 bool operator()(const uchar *p1, const uchar *p2) const { return (memcmp(p1, p2, NUM_BYTES) < 0); }; }; typedef std::set<uchar *, hash_comparator> hash_set;
补充说明
std::set的多数成员函数(尤其是find这类const成员函数,或是返回const迭代器的场景)都会要求比较器的调用是const安全的。将比较运算符声明为const,既符合STL容器对比较器的规范,也符合逻辑——比较操作本身不应该修改比较器自身的状态。
内容的提问来源于stack exchange,提问作者user1479670
相关产品推荐
相关产品推荐

