- iterator[meta header]
- std[meta namespace]
- counted_iterator[meta class]
- function[meta id-type]
- cpp20[meta cpp]
constexpr counted_iterator& operator++(); // (1) C++20
decltype(auto) operator++(int); // (2) C++20
constexpr decltype(auto) operator++(int); // (2) C++23
constexpr counted_iterator operator++(int)
requires forward_iterator<I>; // (3) C++20
counted_iterator operator++(int)
requires forward_iterator<I> = default; // (3) C++29イテレータをインクリメントする。
- (1) : 前置インクリメント
- (2), (3) : 後置インクリメント
- (1), (2) :
count()> 0
現在のイテレータとカウントの値をそれぞれ、current、lengthメンバ変数に保持するとする。
-
(1) : 以下と等価
++current; --length; return *this;
-
(2) : 以下と等価
--length; try { return current++; } catch (...) { ++length; throw; }
-
(3) : 以下と等価
counted_iterator tmp = *this; ++*this; // (1)に委譲 return tmp;
- (3) : C++29で、後置インクリメント・デクリメント演算のdefault定義を使用した
= default定義へ規定が変更された。動作は変わらない
#include <iostream>
#include <iterator>
#include <ranges>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::counted_iterator ci{std::ranges::begin(vec), 5};
std::cout << *ci << '\n';
++ci;
std::cout << *ci << '\n';
ci++;
std::cout << *ci << '\n';
}- ++ci[color ff0000]
- ci++[color ff0000]
1
2
3
- C++20
- Clang: ??
- GCC: 10.1 [mark verified]
- Visual C++: 2019 Update 9 [mark verified]
- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
- LWG Issue 3643. Missing
constexprinstd::counted_iterator- C++23で、後置インクリメント(2)に
constexprが追加された
- C++23で、後置インクリメント(2)に
- P3697R1 Minor additions to C++26 standard library hardening
- P3878R1 Standard library hardening should not use the 'observe' semantic
- P3785R1 Library Wording Changes for Defaulted Postfix Increment and Decrement Operations
- C++29で、後置演算子の規定が
= default定義へ書き換えられた
- C++29で、後置演算子の規定が