某类型需满足什么条件才能使其默认哈希函数可拷贝构造?
std::hash<_Tp>满足可拷贝构造的要求
当实例化std::unordered_map或std::unordered_set时,GCC的libstdc++会在<bits/hashtable.h>中触发如下断言:
static_assert(is_copy_constructible<_Hash>::value, "hash function must be copy constructible");
以下是确保默认哈希函数std::hash<_Tp>可拷贝构造的具体要求:
通用C++11及以上标准要求
- 对于标准库已提供
std::hash特化的类型(如基本类型、std::string、std::shared_ptr、std::vector<bool>等),这些特化本身天生满足可拷贝构造。因为标准要求这些哈希函数对象要么是无状态的空类,要么仅包含可拷贝的成员,默认生成的拷贝构造函数即可通过is_copy_constructible检查。 - 若用户自定义类型未特化
std::hash<_Tp>,标准库不会自动生成对应的哈希特化,此时尝试使用std::unordered_map/_set会直接触发编译错误,不会走到拷贝构造的断言检查环节。
GCC 15.2.0配套libstdc++的特定细节
- libstdc++中所有标准特化的
std::hash均为空类或仅含可拷贝成员的类,它们的拷贝构造函数要么是编译器默认生成的(且未被禁用),要么是显式定义的可拷贝构造函数,必然满足is_copy_constructible的要求。 - 若用户自行特化
std::hash<_Tp>,需保证:- 特化类拥有可访问的拷贝构造函数(无论是默认生成还是自定义实现)
- 拷贝构造函数未被
delete修饰 - 特化类的所有非静态成员均满足可拷贝构造条件(例如不要持有
std::unique_ptr这类不可拷贝的成员)
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

