为什么std::hash不专门用于std::reference_wrapper

Why is std::hash not specialised for std::reference_wrapper?

本文关键字:std reference wrapper 用于 hash 为什么      更新时间:2023-10-16

我原以为会这样,但在我的标准库实现(gcc-4.8.2)中找不到。

为什么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());
        }
    }; 
}

std::reference_wrapper主要用于在默认复制值的实用程序(如std::bind)中提供引用语义。

在容器中直接使用std::reference_wrapper本质上类似于指针(除了它不可为null)。指针(和智能指针)的哈希遵循引用(即地址)语义。

当然,您总是可以提供自己的散列函数。如果将其定义为所有指针和智能指针的模板,那么T*可能是比reference_wrapper<T>更好的值类型选择。

请注意,如果您已经在对对象进行散列并存储散列,则可以通过将所有内容都保存在unordered_map中来消除重复。那么值标识和对象标识将是相同的。

相关文章: