最終更新日時: 2026年02月26日 13時20分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<iterator>

# std::common_iterator::コンストラクタ(C++20)

    constexpr common_iterator() requires default_initializable<I> = default;  // (1)

    constexpr common_iterator(I i);                               // (2)

    constexpr common_iterator(S s);                               // (3)

    template<class I2, class S2>
      requires convertible_to<const I2&, I> &&
               convertible_to<const S2&, S>
    constexpr common_iterator(const common_iterator<I2, S2>& x);  // (4)

## 概要

`common_iterator`オブジェクトを構築する。

## 堅牢化された事前条件

- (4) : `x.v_.valueless_by_exception() == false`であること。

## 効果

`I, S`の値のどちらかを`variant<I, S>`型のメンバ変数`v_`に保持するとする。

- (1) : `v_`をデフォルト構築（`I`をデフォルト構築して初期化）する。
- (2) : `v_{in_place_type<I>, std::move(i)}`が行われたかのように`v_`を初期化する。
- (3) : `v_{in_place_type<S>, std::move(s)}`が行われたかのように`v_`を初期化する。
- (4) : `i = x.v_.index()`として、`v_{in_place_index<i>, get<i>(x.v_)}`が行われたかのように`v_`を初期化する。

## 例

    #include <iostream>
    #include <iterator>
    #include <ranges>

    int main() {
      auto seq = std::views::iota(1) | std::views::take(5);

      using CI = std::common_iterator<std::ranges::iterator_t<decltype(seq)>, std::ranges::sentinel_t<decltype(seq)>>;

      auto i = std::ranges::begin(seq);
      auto s = std::ranges::end(seq);

      // (1) デフォルトコンストラクタ
      CI ci1{};

      // (2) イテレータから構築
      CI ci2{i};

      // (3) 番兵から構築
      CI ci3{s};

      // (3) コピーコンストラクタ
      CI ci4{ci2};
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 9 ✅

## 関連項目

- `variant` コンストラクタ

## 参照

- P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
- P2325R3 Views should not be required to be default constructible
- P3697R1 Minor additions to C++26 standard library hardening
- P3878R1 Standard library hardening should not use the 'observe' semantic