为何指针的std::iterator_traits::iterator_category非std::contiguous_iterator_tag?
问题与背景
iterator_traits针对指针的特化如下:
namespace std { template<class T> requires is_object_v<T> struct iterator_traits<T*> { using iterator_concept = contiguous_iterator_tag; using iterator_category = random_access_iterator_tag; using value_type = remove_cv_t<T>; using difference_type = ptrdiff_t; using pointer = T*; using reference = T&; }; }
为何指针的iterator_concept是std::contiguous_iterator_tag,但iterator_category却不是?据我所知,指针在各方面都属于连续迭代器。这是疏忽所致,还是存在实际原因?
解答
这是兼容性考量导致的设计,并非疏忽。
在C++20引入iterator_concept之前,迭代器的分类完全依赖iterator_category,当时并没有contiguous_iterator_tag,指针的迭代器分类就是random_access_iterator_tag——所有依赖旧分类的代码,都会把指针当作随机访问迭代器处理。
C++20新增连续迭代器概念时,为了不破坏既有代码的兼容性,做了区分设计:
iterator_concept是C++20及以后用于迭代器概念检查的「现代接口」,所以给指针标记为符合其实际特性的contiguous_iterator_tag,让现代代码能利用连续迭代器的专属优化;iterator_category作为「遗留接口」,保持原有的random_access_iterator_tag不变,确保那些基于旧分类编写的代码(比如通过iterator_category做分支逻辑判断的代码)不会因为类型变更出现编译错误或异常行为。
这种设计是新特性兼容旧代码的典型方案,既推进了标准迭代器体系的完善,又保障了历史代码的稳定性。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

