Instead, define explicit specializations for the basic types listed in
the SGI documentation. This solves two problems:
- Helps avoid silent ODR violations caused by the absence of a user-supplied __gnu_cxx::hash specialization in cases where a std::hash specialization exists (e.g. for std::string).
- gnu_cxx::hash semantics are slightly different to those of std::hash (for example, the former may dereference a pointer argument) so it is inappropriate for gnu_cxx::hash to receive std::hash specializations by default.
Now about
assert(__gnu_cxx::hash<std::string>()(std::string()) == 0); // error
instead?
That way you can't get caught up with implicit conversions.
[ I don't think it will matter, but I've been caught out before by failing tests failing, but for the wrong reason. ]