std::common_iterator<I,S>::operator++
From cppreference.com
< cpp | iterator | common iterator
| 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 に等しい場合、振る舞いは未定義です。
var が保持する I 型のイテレータを it とします。すなわち、std::get<I>(var) です。
1) 前置インクリメント。 ++it; return *this; と同等です。
2) 後置インクリメント
- I が
forward_iteratorをモデルとする場合、 auto tmp = *this; ++*this; return tmp; と同等です。 - 変数定義 auto&& ref = *it++; が well-formed である場合、または
- 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 の場合、 return it++; と同等です。
- それ以外の場合、 postfix_proxy p(**this); ++*this; return p; と同等です。ここで
postfix_proxyは公開専用のヘルパー型です (3)。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
1) *this
2) 変更前の *this のコピー、または基底となるイテレータの後置インクリメントの結果、あるいは前述のように現在の要素の値を保持するプロキシ。
[編集] 例
このコードを実行
#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++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2259R1 | C++20 | 後置インクリメントが、より多くの状況で結果を破棄する可能性がある | プロキシクラスが結果を保持するために使用される |
| LWG 3546 | C++20 | プロキシオブジェクトの初期化が、場合によってはill-formedであった | 状況と定義が調整された |
| LWG 3574 | C++20 | variant は完全にconstexprでしたが(P2231R1)、 common_iterator はそうではありませんでした。 |
constexpr にもなりました。 |
| LWG 3595 | C++20 | プロキシ型の関数が constexpr および noexcept を欠いていた | 追加された |
[編集] 関連項目
| 2つのイテレータアダプタ間の距離を計算する (関数テンプレート) |