You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

某类型需满足什么条件才能使其默认哈希函数可拷贝构造?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.09 06:12:31