专栏首页C++核心准则原文翻译C++核心准则C.89:保证哈希不会抛出异常

C++核心准则C.89:保证哈希不会抛出异常

C.89: Make a hash noexcept

C.89:保证哈希不会抛出异常

Reason(原因)

Users of hashed containers use hash indirectly and don't expect simple access to throw. It's a standard-library

requirement.

哈希容器的用户间接地使用哈希功能,不希望简单的操作发生异常。这是标准库的要求。

Example, bad(反面示例)

template<>
struct hash<My_type> {  // thoroughly bad hash specialization
    using result_type = size_t;
    using argument_type = My_type;

    size_t operator() (const My_type & x) const
    {
        size_t xs = x.s.size();
        if (xs < 4) throw Bad_My_type{};    // "Nobody expects the Spanish inquisition!"
        return hash<size_t>()(x.s.size()) ^ trim(x.s);
    }
};

int main()
{
    unordered_map<My_type, int> m;
    My_type mt{ "asdfg" };
    m[mt] = 7;
    cout << m[My_type{ "asdfg" }] << '\n';
}

If you have to define a hash specialization, try simply to let it combine standard-library hash specializations with ^ (xor). That tends to work better than "cleverness" for non-specialists.

如果你已经定义了哈希特化,争取简单地实现为通过异或和标准库哈希特化的组合。

Enforcement(实现建议)

  • Flag throwing hashes.
  • 提示抛出异常的哈希。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c89-make-a-hash-noexcept


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则C.82:不要在构造函数或析构函数中调用虚函数

    C.82: Don't call virtual functions in constructors and destructors

    面向对象思考
  • C++核心准则ES.28: 使用lambda表达式进行变量的复杂初始化,特别是常量变量

    It nicely encapsulates local initialization, including cleaning up scratch varia...

    面向对象思考
  • C++核心准则C.180:使用联合体节约内存

    A union allows a single piece of memory to be used for different types of object...

    面向对象思考
  • 全网把 Map 中的 hash() 分析的最透彻的文章,别无二家

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。 这种转换是一种压缩映射,也...

    用户1655470
  • 关于undo表空间配置错误的ORA-30012

          undo表空间是Oracle体系结构的重要组成部分,为什么我们可以回滚,就是因为有它。数据库任意数据的修改都会在undo表空间里生成前镜像,一是可以...

    Leshami
  • Python OpenCV与中文相关的三个常见问题

    --------------------------------------------------------------------------

    Color Space
  • 接口测试基础——第2篇smtplib发送文字邮件

    用户2149234
  • 零基础使用Django2.0.1打造在线教育网站(二十五):常见的网络攻防

    努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

    啃饼小白
  • 应用实战:从Redis到Aerospike,我们踩了这些坑

           个推专注为开发者们提供消息推送服务多年。通过个推SDK,手机终端与服务器建立长连接,维持在线状态。然而在网络异常等情况下,消息无法实时送达到终端用...

    个推君
  • python simplehttpser

    便可以启动http服务了,用来分发资源。 但是当我们想要引用该页面的资源时,因为浏览器的跨域访问限制,不能够如愿,如何解决呢?

    py3study

扫码关注云+社区

领取腾讯云代金券