Я думал, что это было бы, но я не могу найти это в своей стандартной библиотечной реализации (gcc-4.8.2).Почему std :: hash не специализируется на std :: reference_wrapper?
Почему std::hash
еще не специализировался на std::reference_wrapper
?
#pragma once
#include <functional>
namespace std
{
template<typename T>
struct hash<reference_wrapper<T>>
{
size_t operator()(const reference_wrapper<T>& r) const
{
return std::hash<T>()(r.get());
}
};
}
Возможно, потому что, если у вас есть контейнер ссылочных оберток, неясно, должно ли оно хешировать ссылки или референты, и предоставление стандартной специализации должно было бы выбрать один и при этом путать людей. Поскольку это не предусмотрено, вы вынуждены делать свое намерение явным. – Brian
Если не ссылка, на что бы вы ссылались: 'reference_wrapper'? Это только член 'get()', который возвращает 'T &' (и оператор вызова функции, который делает то же самое). Он существует почти исключительно для того, чтобы ссылки хранились в стандартных контейнерах. –
Указатель, * i.e. *, 'std :: addressof (r.get())'. – Brian