unordered_map :: find with key std :: par de ponteiros com falhas de hash personalizadas no VS2012

Eu precisava de umstd::unordered_map com a tecla astd::pair<T*, T*> então eu "roubei" o seguinte código:

template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
  std::hash<T> hasher;
  seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}

namespace std
{
  template<typename S, typename T> struct hash<pair<S, T>>
  {
    inline size_t operator()(const pair<S, T> & v) const
    {
      size_t seed = 0;
      ::hash_combine(seed, v.first);
      ::hash_combine(seed, v.second);
      return seed;
    }
  };
}

deste stackoverflowresponda.

Funciona como um encanto em máquinas Linux com o gcc 4.9.2. No entanto, no Windows Visual Studio 2012, ele trava ao chamar a função de membrofind() do meuunordered_map. Um amigo meu depurou a falha na máquina Windows e relatou que ela quebra apenas no modo de compilação de depuração, fornecendo "vetor subscrito fora do intervalo".

Q:O código publicado é válido para hash de umstd::pair<T*, T*>?Existe uma maneira mais robusta / melhor de fazer hash de umstd::pair<T*, T*>?O que causa esse comportamento estranho?

P.S: Desculpe profundamente por não postar ummcve mas é impossível fazer isso.

questionAnswers(1)

yourAnswerToTheQuestion