为什么 std::vector<int>::iterator 不是连续迭代器?

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 中失败了。

https://godbolt.org/z/oG1x1xdda

Jan*_*tke 8

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用于其类型。不保证它存在,您应该直接使用这些概念。