为何Clang对容器迭代器的noexcept(++it)与noexcept(*it)处理不一致?
C++标准容器迭代器的noexcept属性疑问
目前尚不明确C++标准是否要求标准容器迭代器的前进操作(++)和解引用操作(*)必须是noexcept的。
不同编译器对此的实现存在差异:
- GCC与MSVC一致将所有标准容器迭代器的上述操作标记为
noexcept - Clang仅对
std::vector、std::basic_string的迭代器标记为noexcept,而std::list、std::set、std::map、std::unordered_set、std::unordered_map的迭代器则标记为noexcept(false)
示例代码如下:
#include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <vector> #include <list> #include <string> #include <ranges> template<typename Iterator> concept nothrow_advancable = noexcept(++std::declval<Iterator&>()); template<typename Iterator> concept nothrow_dereferencable = noexcept(*std::declval<Iterator&>()); static_assert(nothrow_advancable<std::ranges::iterator_t<std::vector<int>&>>); static_assert(nothrow_advancable<std::ranges::iterator_t<std::basic_string<char>&>>); static_assert(nothrow_advancable<std::ranges::iterator_t<std::list<int>&>>); // Clang下不满足noexcept static_assert(nothrow_advancable<std::ranges::iterator_t<std::set<int>&>>); // Clang下不满足noexcept static_assert(nothrow_advancable<std::ranges::iterator_t<std::map<int, int>&>>); // Clang下不满足noexcept static_assert(nothrow_advancable<std::ranges::iterator_t<std::unordered_set<int>&>>); // Clang下不满足noexcept static_assert(nothrow_advancable<std::ranges::iterator_t<std::unordered_map<int, int>&>>); // Clang下不满足noexcept static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::vector<int>&>>); static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::basic_string<char>&>>); static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::list<int>&>>); // Clang下不满足noexcept static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::set<int>&>>); // Clang下不满足noexcept static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::map<int, int>&>>); // Clang下不满足noexcept static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::unordered_set<int>&>>); // Clang下不满足noexcept static_assert(nothrow_dereferencable<std::ranges::iterator_t<std::unordered_map<int, int>&>>); // Clang下不满足noexcept
内容的提问来源于stack exchange,提问作者wanghan02
相关产品推荐
相关产品推荐

