【发布时间】:2021-07-05 23:00:01
【问题描述】:
在 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,除非修改值 throws。如果修改值确实抛出,它会在所涉及的容器之外这样做。
但为什么该提案后面的措辞没有发言权?
【问题讨论】:
-
请注意,与
merge()不同,extract()必须复制容器的分配器。但是分配器模型要求复制是 noexcept。看起来extract()可能是 noexcept 如果比较器是。
标签: c++ language-lawyer c++20 splice throws