我注意到std::flat_set
和std::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_set
和std::flat_map
中声明了相同的成员函数noexcept。
1条答案
按热度按时间sdnqo3pr1#
经过一些研究,我发现添加特定于函数的noexcept可能是危险的。事实上,即使函数很简单,将其标记为noexcept可能会破坏现有代码。这个问题正好发生在
std::stack
,std::queue
和std::priority_queue
容器适配器上,自C98起,提供empty()
和size()
成员函数的容器,因此不强制实现者使用底层容器的成员函数,这些成员函数也是noexcept。如果将noexcept特定参数引入此类成员函数,现有代码可能会中断。一个可能的解决方案是使用条件noexcept,检查底层容器是否也使用noexcept函数。
另一方面,
std::flat_set
和std::flat_map
容器适配器没有问题,因为它们是在C11之后引入的,因此实现者被迫使用底层容器的成员函数。