微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 std::set::extract() 和 std::set::insert(nh) 的标准中没有不抛出保证?

如何解决为什么 std::set::extract() 和 std::set::insert(nh) 的标准中没有不抛出保证?

在 C++20 (N4849) 中,关联容器的 extract()insert(node_handle)/insert(hint,node_handle) 方法没有异常安全措辞。

但是对于merge(),有这样的措辞:

抛出:除非比较对象抛出,否则什么都没有。

位置:
22.2.6 关联容器 [associative.reqmts]
表 78:关联容器要求(除容器外)[tab:container.assoc.req]
第799页

显然最初的提议 (P0083R3) 旨在使其不被抛出(第 5 页):

异常安全

如果容器的Compare函数是no-throw(这很常见),那么移除、修改和插入节点都是no-throw,除非修改值会抛出。如果修改该值确实抛出了异常,则它会在所涉及的容器之外进行。

但为什么在该提案后面的拟议措辞中没有发言权?

解决方法

采用节点句柄的 insert 成员有一个前提条件,即节点句柄中的分配器比较等于容器的分配器。

采用迭代器的 extract 成员有一个前提条件,即迭代器是容器中有效的可解引用迭代器。

标准库的政策是具有运行时前提条件的函数不是 noexcept

带有 extract 参数的 key_type 成员只能在比较函数抛出时抛出,但这仍然意味着它不能是 noexcept

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。