Мне непонятно, из стандарта С++ 11, где должны быть определены пользовательские функции hash<T>.
Например, в 23.5.2 Заголовок <unordered_map> он показывает:
template <class Key,
class T,
class Hash = hash<Key>,
class Pred = std::equal_to<Key>,
class Alloc = std::allocator<std::pair<const Key, T> > >
class unordered_map;
Это говорит о том, что по умолчанию в глобальном пространстве имен выполняется поиск hash<T>, тогда как equal_to<> выполняется поиск в пространстве имен std.
Почему разница в пространстве имен между hash<> и equal_to<>?
(На самом деле, в описании http://www.cplusplus.com/reference/unordered_map/unordered_map/ ни одно из них не указывает пространство имен std.)
Таким образом, при определении функтора hash<> для пользовательского типа мы должны заключить его в блок namespace std { } или он может оставаться в текущем пространстве имен?
Если код не имеет using namespace std;, то как контейнеры STL, такие как unordered_map, знают, что нужно искать в пространстве имен std для предопределенных функторов hash<>, связанных с примитивными типами? Похоже, что по умолчанию Hash = hash<Key> не сможет найти их.
Извините, если это глупые вопросы.