template<typename T, size_t I = std::tuple_size<T>::value - 1>
struct tuple_hash
{
- std::size_t operator()(T t) const noexcept
+ std::size_t operator()(T const& t) const noexcept
{
- auto v = std::get<I>(t);
- auto h = std::hash<decltype(v)>{}(v);
+ const auto &v = std::get<I>(t);
+ auto h = std::hash<std::remove_cvref_t<decltype(v)>>{}(v);
auto h1 = tuple_hash<T, I - 1>{}(t);
return h ^ h1 << 1;
}
template<typename T>
struct tuple_hash<T, 0>
{
- std::size_t operator()(T t) const noexcept
+ std::size_t operator()(T const& t) const noexcept
{
- auto v = std::get<0>(t);
- auto h = std::hash<decltype(v)>{}(v);
+ const auto &v = std::get<0>(t);
+ auto h = std::hash<std::remove_cvref_t<decltype(v)>>{}(v);
return h;
}
};