std:: iterator_traits <std::counted_iterator>
| Iterator concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator primitives | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Algorithm concepts and utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Indirect callable concepts | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Common algorithm requirements | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Utilities | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iterator adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Non-member functions | ||||
|
(C++20)
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
|
(C++20)
|
||||
| Helper classes | ||||
|
iterator_traits
<std::counted_iterator>
(C++20)
|
|
定义于头文件
<iterator>
|
||
|
template
<
std::
input_iterator
I
>
requires
/* 见下文 */
|
(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
|
已添加约束条件 |
参见
|
为迭代器的属性提供统一接口
(类模板) |