为什么 std::vector::swap 的 noexcept 规范与所有其他容器交换函数不同?

Why does std::vector::swap have a different noexcept specification than all other container swap functions?

提问人:LoS 提问时间:5/11/2023 最后编辑:LoS 更新时间:11/5/2023 访问量:684

问:

我注意到容器的交换函数具有与所有其他容器不同的 noexcept-specification。具体来说,如果表达式为 true,则函数为 no,但其他容器要求表达式为 true。std::vectorstd::allocator_traits<Allocator>::propagate_on_container_swap || std::allocator_traits<Allocator>::is_always_equalstd::allocator_traits<Allocator>::is_always_equal

既然交换函数的行为是相同的,为什么 noexcept-specification 在容器中有所不同?std::vector

C++ C++17 标准向量 交换 noexcept

评论

2赞 sigma 5/14/2023
霍华德·辛南特(Howard Hinnant)显然在此评论中回答了您的问题!
2赞 LoS 5/14/2023
该注释解释了为什么交换函数的 noexcept-specification 以这种方式实现,但它没有回答“为什么 noexcept-specification 仅在容器中有所不同”的问题。std::vector
1赞 user17732522 5/14/2023
不幸的是,我只能找到关于这个话题的非公开讨论的链接。也许当他们为交换和移动操作引入条件说明符时,这只是谨慎。与其他容器相比,验证它不会导致 vector 的实现问题要容易得多,并且 vector 的优先级也应该更高。标准库实现允许使用比标准中指定的更严格的规范,因此这只是所有实现都应同意的最低要求。noexceptnoexcept
2赞 sigma 5/15/2023
这个话题的历史当然很有趣。只有在使用自定义的有状态分配器时才会出现这种情况,因为模板是无状态的,因此始终相等。编写这样的分配器是大多数 C++ 程序员不需要做的事情,但显然 Bloomberg 有一个使用这些的主要代码库。因此,Bloomberg 开发人员提供了我在 allocators、swapping 和 noexcept 上找到的大部分输入。在标准库中使用 noexcept 的“Lakos 规则”以其中之一命名。noexcept(false)std::allocator
2赞 sigma 5/15/2023
读完这篇文章后,如果他们只是主要或专门将这些分配器与向量一起使用,我不会感到惊讶,因此对标准进行这种特殊的更改最感兴趣。

答: 暂无答案