Ответ 1
К сожалению, эта программа имеет поведение undefined. С++ 11 §17.6.4.2.1:
Программа может добавлять специализацию шаблона для любого стандартного шаблона библиотеки к пространству имен std только в том случае, если объявление зависит от пользовательского типа, а специализация соответствует требованиям стандартной библиотеки для исходного шаблона и не запрещена явно.
hash<pair<int,int>>
зависит только от примитивных и стандартных типов библиотек. Это легко обойти, определив свой хэш-класс вне пространства имен std
и используя этот хэш явно в вашем объявлении карты:
struct pairhash {
public:
template <typename T, typename U>
std::size_t operator()(const std::pair<T, U> &x) const
{
return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
}
};
class abc {
std::unordered_map<std::pair<int,int>, int, pairhash> rules;
};
EDIT: я использовал xor для объединения хэшей членов пары здесь, потому что я ленив, но для серьезного использования xor - это довольно дрянное сочетание функций хеша.