Namespaces
Variants

std:: iterator_traits <std::counted_iterator>

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定义于头文件 <iterator>
template < std:: input_iterator I >

requires /* 见下文 */
struct iterator_traits < std:: counted_iterator < I >> : std:: iterator_traits < I > {
using pointer = std:: conditional_t < std:: contiguous_iterator < I > ,
std:: add_pointer_t < std:: iter_reference_t < I >> ,
void > ;

} ;
(C++20 起)

继承来自定制化(由标准偏特化或程序定义特化生成) std:: iterator_traits < I > 的属性,并调整成员类型 pointer ,其中 I 需满足 input_iterator 概念。

值得注意的是, iterator_concept (如果存在)和 iterator_category 均继承自 std:: iterator_traits < I >

requires子句中的条件为 true 当且仅当 std:: iterator_traits < I > 不是从主模板生成的。

目录

说明

P2259R1 之前,即使 std:: iterator_traits < I > 是由主模板生成的,也会使用此特化。这导致在测试 std:: counted_iterator < I > 是否符合迭代器概念(例如 forward_iterator )时,对 /*ITER_CONCEPT*/ 的判定不会考虑 I::iterator_concept ,因此 std:: counted_iterator < I > 有时会错误地表现为无法满足该概念。此错误行为在 libstdc++ 10.4 之前版本及 MSVC STL VS 2022 17.0 Preview 3 之前版本中均有实现。

标准库为指针类型、 std::iterator_traits std::counted_iterator std::common_iterator 提供了偏特化版本。

示例

#include <iterator>
#include <list>
#include <type_traits>
#include <vector>
int main()
{
    std::vector v{1, 2, 3, 4};
    std::list l{1, 2, 3, 4};
    std::counted_iterator iv{v.begin(), 3};
    std::counted_iterator il{l.begin(), 3};
    static_assert(std::is_same<int*, std::iterator_traits<decltype(iv)>::pointer>());
    static_assert(std::is_same<void, std::iterator_traits<decltype(il)>::pointer>());
}

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确行为
P2259R1 C++20 缺少 requires 子句
pointer 被无条件定义为 void
已添加约束条件

参见

为迭代器的属性提供统一接口
(类模板)