- iterator[meta header]
- std[meta namespace]
- common_iterator[meta class]
- function[meta id-type]
- cpp20[meta cpp]
common_iterator& operator++(); // (1) C++20
decltype(auto) operator++(int); // (2) C++20
common_iterator operator++(int)
requires forward_iterator<I> = default; // (3) C++29イテレータをインクリメントする。
holds_alternative<I>(v_) == true
I, Sの値のどちらかをvariant<I, S>型のメンバ変数v_に保持しているとして
-
(1) : 以下と等価
++get<I>(v_); return *this;
-
(2) : 次のどちらかと等価
-
Iがforward_iteratorのモデルである場合common_iterator tmp = *this; ++*this; return tmp;
-
それ以外の場合 :
return get<I>(v_)++;
-
- (2), (3) : C++29で、
Iがforward_iteratorのモデルとなる場合の後置インクリメントが、後置インクリメント・デクリメント演算のdefault定義を使用した= default定義のオーバーロード(3)として分離された。どちらの場合も動作は変わらない
#include <iostream>
#include <iterator>
#include <ranges>
int main() {
auto seq = std::views::iota(1) | std::views::take(5);
// common_iteratorを通すことでイテレータ型と番兵型を合わせる
using CI = std::common_iterator<std::ranges::iterator_t<decltype(seq)>, std::ranges::sentinel_t<decltype(seq)>>;
CI ci{std::ranges::begin(seq)};
std::cout << *ci << std::endl;
++ci;
std::cout << *ci << std::endl;
ci++;
std::cout << *ci << std::endl;
}- ++ci[color ff0000]
- views::iota[link /reference/ranges/iota_view.md]
- views::take[link /reference/ranges/take_view.md]
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)
- 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で、後置演算子の規定が