# std::common_iterator<I,S>::common_iterator

< cpp‎ | iterator‎ | common iterator

constexpr common_iterator() requires std::default_initializable<I> = default; | (1) | (C++20 起)
constexpr common_iterator( I i ); | (2) | (C++20 起)
constexpr common_iterator( S s ); | (3) | (C++20 起)
template< class I2, class S2 > requires std::convertible_to<const I2&, I> && std::convertible_to<const S2&, S> constexpr common_iterator( const common_iterator<I2, S2>& x ); | (4) | (C++20 起)

构造新的迭代器适配器，等效地初始化底层 std::variant<I, S> 成员对象 `var` 以保有一个 `I` （迭代器）或 `S` （哨位）对象。

1) 默认构造函数。默认初始化 `var` 。构造后， `var` 保有一个值初始化的 `I` 对象。在产生的迭代器适配器上的操作拥有有定义行为，当且仅当值初始化的 `I` 上的操作亦拥有有定义行为。
2) 构造后 `var` 保有一个从 `i` 移动构造的 `I` 对象。
3) 构造后 `var` 保有一个从 `s` 移动构造的 `S` 对象。
4) 若 x.var 保有一个 `I2` 或 `S2` ，则构造后 `var` 分别保有一个从 x.var 所保有的该可选项初始化的 `I` 或 `S` 对象。若 `x` 在非法状态，即 x.var.valueless_by_exception() 为 true 则行为未定义。

### 参数

i | - | 要适配的迭代器
s | - | 要适配的哨位
x | - | 要转换的迭代器适配器

### 示例

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <numeric>
    #include <vector>

    int main()
    {
        std::vector v {3,1,4,1,5,9,2};

        using CI = std::common_iterator<
                       std::counted_iterator<std::vector<int>::iterator>,
                       std::default_sentinel_t
                       >;
        CI unused; // (1)
        CI start  { std::counted_iterator{std::next(begin(v)), ssize(v)-2} }; // (2)
        CI finish { std::default_sentinel }; // (3)
        CI first  { start };  // (4)
        CI last   { finish }; // (4)

        std::copy(first, last, std::ostream_iterator<int>{std::cout, " "});
        std::cout << '\n';

        std::common_iterator<
          std::counted_iterator<
            std::ostream_iterator<double>>,
            std::default_sentinel_t>
            beg { std::counted_iterator{std::ostream_iterator<double>{std::cout,";  "}, 5} },
            end { std::default_sentinel };
        std::iota(beg, end, 3.1);
        std::cout << '\n';
    }

输出：

    1 4 1 5 9
    3.1;  4.1;  5.1;  6.1;  7.1;

### 参阅

operator= (C++20) | 赋值另一迭代器适配器 (公开成员函数)