gpt4 book ai didi

c++ - 为什么在std::set::extract()和std::set::insert(nh)的标准中没有无掷保证?

转载 作者:行者123 更新时间:2023-12-03 15:47:33 28 4
gpt4 key购买 nike

在C++ 20(N4849)中,关联容器的extract()insert(node_handle)/insert(hint, node_handle)方法没有异常安全性措词。
但是对于merge(),虽然有这样的写法:

Throws: Nothing unless the comparison object throws.


位置:22.2.6关联容器[associative.reqmts]表78:关联容器要求(除了容器之外)[tab:container.assoc.req]第799页
显然,原始提议( P0083R3)旨在使其不抛出(第5页):

Exception safety

If the container’s Compare function is no-throw (which is very common), then removing a node, modifying it, and inserting it is no-throw unless modifying the value throws. And if modifying the value does throw, it does so outside of the containers involved.


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

最佳答案

带有节点句柄的insert成员具有一个前提条件,即该节点句柄中的分配器比较等于容器的分配器。
带有迭代器的extract成员具有前提条件,即该迭代器是进入容器的有效可取消引用的迭代器。
标准库的策略是具有运行时前提条件的函数不是noexcept
带有extract参数的key_type成员只能在比较函数抛出时抛出,但这仍然意味着它不能是noexcept

关于c++ - 为什么在std::set::extract()和std::set::insert(nh)的标准中没有无掷保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67031685/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com