Namespaces
Variants

std::common_iterator<I,S>:: operator++

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
constexpr common_iterator & operator ++ ( ) ;
(1) (C++20以降)
constexpr decltype ( auto ) operator ++ ( int ) ;
(2) (C++20以降)
ヘルパー型
class /*postfix_proxy*/ {

std:: iter_value_t < I > keep_ ;
constexpr postfix_proxy ( std:: iter_reference_t < I > && x )
: keep_ ( std:: forward < std:: iter_reference_t < I >> ( x ) ) { }
public :
constexpr const std:: iter_value_t < I > & operator * ( ) const noexcept {
return keep_ ;
}

} ;
(3) ( 説明専用* )

基になるイテレータをインクリメントします。

基となる std::variant メンバオブジェクト var が型 I のオブジェクトを保持していない場合、つまり std:: holds_alternative < I > ( var ) false に等しい場合、動作は未定義です。

it を型 I のイテレータとし、 var が保持するもの、すなわち std :: get < I > ( var ) とする。

1) 1つ前進します。 ++ it ; return * this ; と同等です。
2) 後置インクリメント(1を加算):
  • 次と等価: auto tmp = * this ; ++* this ; return tmp ; 、ただし I forward_iterator をモデル化する場合。
  • 次と等価: return it ++ ; 、ただし変数定義 auto && ref = * it ++ ; が適正に形成される場合、あるいは以下のいずれか
false の場合。
  • それ以外の場合、次と等価: postfix_proxy p ( ** this ) ; ++* this ; return p ; 、ここで postfix_proxy は説明専用のヘルパー型 (3) である。

目次

翻訳の説明: - 「Contents」→「目次」に翻訳 - HTMLタグ、属性、
タグ内のテキストは翻訳対象外のため保持
- C++固有の用語(Parameters、Return value、Example、Defect reports、See also)は翻訳せず保持
- 数値や書式は完全に保持
- プロフェッショナルで正確な翻訳を実施

パラメータ

(なし)

戻り値

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 プロキシオブジェクトの初期化が不適格になる場合があった 状況と定義を調整
LWG 3574 C++20 variant は完全なconstexpr(P2231R1)であったが common_iterator はそうではなかった 同様にconstexpr化
LWG 3595 C++20 プロキシ型の関数にconstexprとnoexceptが欠けていた 追加

関連項目

2つのイテレータアダプタ間の距離を計算する
(関数テンプレート)