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

时间:2015-03-31 21:35:06

标签: c++ c++11 stdhash

我以为会有,但我无法在我的标准库实现(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());
        }
    }; 
}

1 个答案:

答案 0 :(得分:2)

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

在容器中直接使用std::reference_wrapper基本上就像一个指针(除了它不可为空)。散列指针(和智能指针)遵循引用(即地址)语义。

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

注意,如果您已经散列对象并存储哈希值,则可以通过将所有内容保留在unordered_map中来消除重复项。然后价值身份和对象身份将是相同的。