静态代码分析/查询:警告==在unordered_set <K,H,CustomEquality>上被调用

问题描述

对于使用自定义等于函数的无序集,比较两个集时该equality definition is ignored。示例:

#include <iostream>
#include <unordered_set>
#include <string>

struct Hash {
    size_t operator()(const std::string& str) const {
        return 0;
    }
};

struct InsensitiveCompare { 
    bool operator() (const std::string& str1,const std::string& str2) const {
        // https://stackoverflow.com/a/43226907/2204581
        return str1.size() == str2.size() && std::equal(str1.begin(),str1.end(),str2.begin(),[](auto a,auto b){return std::tolower(a)==std::tolower(b);});
    }
};

int main()
{
    std::unordered_set<std::string,Hash,InsensitiveCompare> s1,s2;
    
    s1.emplace("test");
    s2.emplace("Test");
    
    std::cout << (s1 == s2 ? "" : "not ") << "equal" << std::endl;
    // prints "not equal"
    
    return 0;
}

http://cpp.sh/2vmwc5

我不明白为什么自定义等式功能没有转发到std::is_permutationoperator== requires比较器在左侧和右侧具有相同的行为,因此可以使用任一比较器。如果您问我,这种情况在最好的情况下是完全出乎意料的,而在最坏的情况下是错的。但是,这不太可能改变。

我的问题是,是否有任何类型的静态代码分析/整理工具可以发现这一点。 -Weverything和clang-tidy都没有让我知道这一点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...