std::sentinel_for std::sized_sentinel_for, std::disable_sized_sentinel_for std::input_iterator std::output_iterator std::forward_iterator std::bidirectional_iterator std::random_access_iterator std::contiguous_iterator std::iterator_traits std::input_iterator_tag, std::output_iterator_tag, std...
而且没有任何std::contiguous_iterator_category可以用于这样的迭代器(因为这可能导致兼容性问题)。所以您不能使用SFINAE工具来验证迭代器是连续的。 C++20的概念解决了这个问题。它还解决了使用连续迭代器的另一个问题。参见,上面对ContiguousIterator行为的解释始于我们有一个指向范围内的元素的指针。那你是怎么弄到的?
vector's iterator should provide a std::iterator_traits specialization with iterator_concept = std::contiguous_iterator_tag if it's available. Otherwise, it is for example unusable with std::span if you pass it as a range. 👍4 Activity jmelasmentioned this on Mar 24, 2021 boost::...
contiguous_iterator_tag corresponds to contiguous_iterator. If iterator_concept is not provided, iterator_category is used as a fallback. If iterator_category is not provided either (i.e. It is not a LegacyIterator), and std::iterator_traits<It> is not specialized, random_access_iterator_ta...
std::same_as<std::add_pointer_t<std::iter_reference_t<I>>>; }; (C++20 起) contiguous_iterator概念细化random_access_iterator,通过提供代表的元素连续存储于内存中的保证。 迭代器概念确定 此概念的定义通过仅用于阐释的别名模板/*ITER_CONCEPT*/说明。
concept成员类型别名,该别名允许别名std::contiguous_iterator_tag或以前的迭代器标记。
6) contiguous_iterator_tag 对应遗留连续迭代器 (LegacyContiguousIterator) 。顾名思义,迭代器分类标签可以用以标示某个迭代器的分类,可以根据这一分类所要求的特性来选择最优算法。 每个迭代器类型 It 都有对应的 std::iterator_traits<It>::iterator_category typedef ,即这五 (C++20 前)六 (C++20 起)种...