Использование ссылки на объект в качестве ключа в std::unordered_map

Я хотел бы знать, можно ли использовать ссылку на объект в качестве ключа в контейнере unordered_map в C++.

#include <unordered_map>

class Object {
    int value;
};

struct object_hash {
  inline size_t operator()(const Object& o) const { return 0; }
};

std::unordered_map<Object&, int, object_hash> map;

При попытке скомпилировать этот простой фрагмент я получил несколько ошибок по поводу переопределения методов:

Использование clang с libc++

/usr/include/c++/v1/unordered_map:352:12: ошибка: член класса не может быть переобъявлен

size_t operator()(const _Cp& __x) const

Использование gcc 4.6 с libstdc++

/usr/include/c++/4.6/bits/hashtable_policy.h:556:5:ошибка: ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator [с _Key = Object&, _Pair = std::pair, _Hashtable = std::_Hashtable, стандартный:: распределитель >, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, ложь, ложь, истина>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’ не может быть перегружен

/usr/include/c++/4.6/bits/hashtable_policy.ч: 537: 5 : ошибка: с ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [с _Key = Object&, _Pair = std::pair, _Hashtable = стандартный::_Hashtable, стандартный:: распределитель>, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, ложь, ложь, истина>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’

Если вместо этого я использую старый gnu hash_map (__gnu_cxx::hash_map), у меня не возникает этой проблемы.

Является ли это ограничением, налагаемым новым стандартом, и если да, то почему?

Есть ли способ обойти это ограничение?

9
задан Peter Mortensen 19 May 2017 в 12:56
поделиться