std::common_iterator<I,S>:: operator++
|
constexpr
common_iterator
&
operator
++
(
)
;
|
(1) | (C++20 起) |
|
constexpr
decltype
(
auto
)
operator
++
(
int
)
;
|
(2) | (C++20 起) |
|
辅助类型
|
||
|
class
/*postfix_proxy*/
{
std::
iter_value_t
<
I
>
keep_
;
|
(3) | ( 仅用于说明* ) |
递增底层迭代器。
若底层
std::variant
成员对象
var
未持有类型
I
的对象,即
std::
holds_alternative
<
I
>
(
var
)
等于
false
,则行为未定义。
令
it
表示类型为
I
的迭代器,由
var
持有,即
std
::
get
<
I
>
(
var
)
。
-
等价于:
auto
tmp
=
*
this
;
++*
this
;
return
tmp
;
,若
I
满足
forward_iterator概念。 - 等价于: return it ++ ; ,若变量定义 auto && ref = * it ++ ; 是合法表达式,或以下任一条件为假:
-
- std:: indirectly_readable < I > 或
- std:: constructible_from < std:: iter_value_t < I > , std:: iter_reference_t < I >> 或
- std:: move_constructible < std:: iter_value_t < I >>
- 的值为 false 。
-
否则等价于:
postfix_proxy p
(
**
this
)
;
++*
this
;
return
p
;
,其中
postfix_proxy是仅用于说明的辅助类型 (3) 。
目录 |
参数
(无)
返回值
示例
#include <algorithm> #include <initializer_list> #include <iostream> #include <iterator> int main() { const auto il = {1, 2, 3, 4, 5, 6}; using CI = std::common_iterator< std::counted_iterator<std::initializer_list<int>::iterator>, std::default_sentinel_t >; CI first{std::counted_iterator{std::begin(il), std::ssize(il) - 2}}; for (; first != std::default_sentinel; ++first) std::cout << *first << ' '; std::cout << '\n'; }
输出:
1 2 3 4
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 适用范围 | 发布时的行为 | 修正后的行为 |
|---|---|---|---|
| P2259R1 | C++20 | 后置递增操作可能在更多场景中丢弃其结果 | 使用代理类来保留结果 |
| LWG 3546 | C++20 | 代理对象的初始化有时会形成错误格式 | 调整了相关场景和定义 |
| LWG 3574 | C++20 |
variant
已完全支持 constexpr (P2231R1) 但
common_iterator
未支持
|
同时改为 constexpr |
| LWG 3595 | C++20 | 代理类型的函数缺少 constexpr 和 noexcept 修饰 | 已添加 |
参见
|
计算两个迭代器适配器之间的距离
(函数模板) |