代码粘贴如下:
auto myComp = []( std::array<const string, 3> &a, std::array<const string, 3> &b )
{
if ( a[0] == b[0] && a[1] == b[1] && a[2] == b[2] ) {
return true;
} else {
return false;
}
};
auto myHash = []( std::array<const string, 3> &a )
{
return std::hash<std::string>()( a[0] )
^ std::hash<std::string>()( a[1] )
^ std::hash<std::string>()( a[2] );
};
std::unordered_set<std::array<const string, 3>, decltype( myHash ), decltype( myComp )> unordSet( 16, myHash, myComp );
整个错误信息是:
MacOSX15.1.sdk/usr/include/c++/v1/__hash_table:607:17 Static assertion failed due to requirement 'integral_constant<bool, false>::value': the specified hash does not meet the Hash requirements
提前非常感谢。
编辑:
我设法找到了支票的定义:
#ifndef _LIBCPP_CXX03_LANG
template <class _Key, class _Hash>
using __check_hash_requirements _LIBCPP_NODEBUG =
integral_constant<bool,
is_copy_constructible<_Hash>::value && is_move_constructible<_Hash>::value &&
__invokable_r<size_t, _Hash, _Key const&>::value >;
原来是这个条件没有通过测试:
__invokable_r<size_t, _Hash, _Key const&>::value
是的,你是对的,这里的问题是无序映射仅接受带有const引用键的散列函数,这是为了保证不同操作期间数据不变性以使容器正常工作所必需的,它在STL库中也被接受。那就是
auto myComp = [](const array<const string, 3> &a, const. array<const string, 3> &b)
{
return (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]);
};
auto myHash = [](const array<const string, 3> &a)
{
return hash<string>()(a[0]) ^ hash<string>()(a[1]) ^ hash<string>()(a[2]);
};
我还建议你阅读 Scott Meyers 所著的《Effective C++》(第 3 章),其中讨论了有效使用 const 引用的主题