Vio*_*ffe 4 c++ iterator c++20
根据标准,如此处引用的,应该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>);
Run Code Online (Sandbox Code Playgroud)
第一个static_assert
成功了,但第二个在最新的 MSVC、GCC 和 clang 中失败了。
std::vector<int>::iterator
是一个连续迭代器,因为它满足std::contiguous_iterator
概念和连续迭代器要求。
std::iterator_traits
不测试某些内容是否满足连续迭代器要求,因为这些是语义要求。甚至指针也没有 acontiguous_iterator_tag
作为它们的iterator_category
,如[iterator.traits] p5中指定的。任何类型拥有此标签的唯一方法是通过专门化std::iterator_traits
。
您应该使用相关概念来测试是否std::vector<int>::iterator
是随机访问迭代器,甚至是连续迭代器:
#include <iterator>
#include <vector>
static_assert(std::random_access_iterator<std::vector<int>::iterator>); // OK
static_assert(std::contiguous_iterator<std::vector<int>::iterator>); // OK
Run Code Online (Sandbox Code Playgroud)
请注意,此测试可能会出现误报。如[iterator.concept.contigulous] p2中所述,具有额外的语义约束,即使迭代器没有对连续迭代器进行建模,也可以满足std::contiguous_iterator
该概念。
另请注意,std::iterator_traits
也可能有一个iterator_concept
别名成员,但仅适用于指针或用户专门std::iterator_traits
用于其类型。不保证它存在,您应该直接使用这些概念。