c++ 为什么std::flat_set和std::flat_map有一些noexcept函数,而其他容器适配器没有?

cdmah0mi  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(187)

我注意到std::flat_setstd::flat_map容器适配器提供了一些noexcept成员函数,特别是以下函数:

[[nodiscard]] bool empty() const noexcept;
size_type size() const noexcept;

但是,所有其他容器适配器都提供与non-noexcept相同的成员函数:

[[nodiscard]] bool empty() const;
size_type size() const;

起初,我同意不引入成员函数中的noexcept的标准,因为实际上不能保证相应容器的成员函数也是noexcept。一个可能的解决方案是引入有条件的noexcept,例如在许多std::swap专门化中。
所以,我不明白为什么在std::flat_setstd::flat_map中声明了相同的成员函数noexcept。

sdnqo3pr

sdnqo3pr1#

经过一些研究,我发现添加特定于函数的noexcept可能是危险的。事实上,即使函数很简单,将其标记为noexcept可能会破坏现有代码。这个问题正好发生在std::stackstd::queuestd::priority_queue容器适配器上,自C98起,提供empty()size()成员函数的容器,因此不强制实现者使用底层容器的成员函数,这些成员函数也是noexcept。如果将noexcept特定参数引入此类成员函数,现有代码可能会中断。
一个可能的解决方案是使用条件noexcept,检查底层容器是否也使用noexcept函数。
另一方面,std::flat_setstd::flat_map容器适配器没有问题,因为它们是在C
11之后引入的,因此实现者被迫使用底层容器的成员函数。

相关问题