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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2259R1 | C++20 | 後置インクリメントがより多くの状況で結果を破棄する可能性があった | 結果を保持するためにプロキシクラスが使用される |
| LWG 3546 | C++20 | プロキシオブジェクトの初期化が不適格になる場合があった | 状況と定義を調整 |
| LWG 3574 | C++20 |
variant
は完全なconstexpr(P2231R1)であったが
common_iterator
はそうではなかった
|
同様にconstexpr化 |
| LWG 3595 | C++20 | プロキシ型の関数にconstexprとnoexceptが欠けていた | 追加 |
関連項目
|
2つのイテレータアダプタ間の距離を計算する
(関数テンプレート) |