根据标准,引用的here,vector<T>::iterator
应该是连续的(对于T
而不是bool
),但在所有3个主要实现中都不是,为什么?
#include <iterator>
#include <vector>
using InputIterator = std::vector<int>::iterator;
static_assert(std::is_same_v<typename std::iterator_traits<InputIterator>::iterator_category, std::random_access_iterator_tag>);
static_assert(std::is_same_v<typename std::iterator_traits<InputIterator>::iterator_category, std::contiguous_iterator_tag>);
第一个static_assert
成功了,但是第二个失败了,使用了最新的MSVC、GCC和clang。
https://godbolt.org/z/oG1x1xdda
1条答案
按热度按时间slmsl1lt1#
std::vector<int>::iterator
* 是 * 一个连续迭代器,因为它满足std::contiguous_iterator
概念和 * 连续迭代器 * 要求。std::iterator_traits
不测试是否满足 contiguous iterator 要求,因为这些是语义要求。即使是指针也没有contiguous_iterator_tag
作为它们的iterator_category
,如[iterator.traits] p5中所指定的。任何类型拥有此标记的唯一方法是通过专门化std::iterator_traits
。您应该使用相关概念来测试
std::vector<int>::iterator
是否是随机访问迭代器,甚至是连续迭代器:请注意,此测试可能会出现假阳性。如[iterator.concept.contiguous] p2中所述,
std::contiguous_iterator
有额外的语义约束,即使迭代器没有对连续迭代器进行建模,这个概念也可能被满足。还要注意的是,
std::iterator_traits
也可能有一个iterator_concept
别名成员,但仅用于指针,或者如果用户为它们的类型专门指定了std::iterator_traits
。它不一定存在,您应该直接使用这些概念。