当使用无序集时,为什么带有非常量运算符的哈希函子不能在Visual Studio中编译?

问题描述

我将原来使我痛苦的代码简化为一个简单的示例:

带有伪相等运算符的类:

class MyClass {
public:
    bool operator==(const MyClass& mc)  {
        return false;
    }
};

然后是该类的虚拟哈希函子:

template<> struct std::hash<MyClass> {
        size_t operator()(const MyClass& s) {
        return 0;
    }
};

和主要方法

int main()
{
    std::unordered_set<MyClass> set_1;
    std::unordered_set<MyClass> set_2;
    set_1 = set_2;

    return 0;
}

在Visual Studio中,这会产生错误

error C3848: expression having type 'const _Hasher' would lose some const-volatile qualifiers in order to call 'size_t std::hash<MyClass>::operator ()(const MyClass &)'

经过数小时的调试,我发现该错误的原因是非常量哈希函子,即,当我将签名更改为size_t operator()(const MyClass& s) const

时,它才起作用

但是,在GCC中,它不会产生任何错误(仅警告未使用的参数),而在Clang中,它只会产生警告:

warning: the specified hash functor does not provide a viable const call operator

我的问题是,为什么此代码无法在Visual Studio中编译?我知道拥有一个非常量哈希函子没有任何意义,但是我还没有找到不应该编译的任何理由。

此外,尽管VS在set_1声明行上发出错误信号,但如果我从set_1set_2删除赋值,代码可以正常编译。

解决方法

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

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

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