zwh*_*nst 9 c++ splice language-lawyer throws c++20
在 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。
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |