为什么std::hash不专门用于std::reference_wrapper
Why is std::hash not specialised for std::reference_wrapper?
我原以为会这样,但在我的标准库实现(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
中来消除重复。那么值标识和对象标识将是相同的。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::iterator::reference 必须是引用吗?
- 使用命名空间 std 时C++ "Reference to overloaded function"错误
- 尝试用C++编码时,我收到一长串错误,例如"/tmp/ccloHU4h.o:dad.cpp:(.text+0x5c): undefined reference to `std::cout'"
- nameless char[] to std::string& reference
- std::thread pass-by-reference调用复制构造函数
- 尝试使用 std::bind 重新分配 std::function 并得到错误"attempting to reference a deleted function"
- 错误"undefined reference to 'std::cout'"
- std::bind and rvalue reference
- 将 std::forward_as_tuple() 结果传递给可能从该对象的 rvalue-reference 成员移动的多个函数?
- 我继承自 std::iterator,但编译器无法识别'pointer'或'reference'
- 返回迭代器时"undefined reference to std::_Rb_tree_const_iterator"
- ' std::bitset::reference '赋值操作符
- "There is no "reference-to-member" type in C + +",std::bind 和 boost::bind 在同一条船上
- C++11 std::函数和std::reference包装器,用于对std::set进行排序
- 错误:从类型为"std::vector:<bool>:reference {aka std::_Bit_reference}"的右值初始化类型为"bool&"的非常量引用无效