- iterator[meta header]
- std[meta namespace]
- common_iterator[meta class]
- function[meta id-type]
- cpp20[meta cpp]
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)
- default_initializable[link /reference/concepts/default_initializable.md]
- convertible_to[link /reference/concepts/convertible_to.md]
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};
}
- std::common_iterator[color ff0000]
- views::iota[link /reference/ranges/iota_view.md]
- views::take[link /reference/ranges/take_view.md]
- iterator_t[link /reference/ranges/iterator_t.md]
- sentinel_t[link /reference/ranges/sentinel_t.md]
- ranges::begin[link /reference/ranges/begin.md]
- ranges::end[link /reference/ranges/end.md]
- C++20
- Clang: ??
- GCC: 10.1 [mark verified]
- Visual C++: 2019 Update 9 [mark verified]