# operator-(std::common_iterator)

< cpp‎ | iterator‎ | common iterator

template< std::sized_sentinel_for<I> I2, std::sized_sentinel_for<I> S2 > requires std::sized_sentinel_for<S, I2> friend constexpr std::iter_difference_t<I2> operator-( const common_iterator& x, const std::common_iterator<I2, S2>& y ); |  | (C++20 起)

计算二个迭代器适配器间的差。认为二个哨位相等。

令 `var` 代表 std::common_iterator 中底层 std::variant 成员对象，若 `x` 或 `y` 非法，即 x.var.valueless_by_exception() || y.var.valueless_by_exception() 为 true 则行为未定义。

此函数模板对通常无限定或有限定查找不可见，而只能在 `std::common_iterator<I>` 为参数的关联类时由实参依赖查找找到。

### 参数

x, y | - | 要计算差的迭代器适配器

### 返回值

- ​0​ ，若 x.var 保有一个 `S` 对象而 y.var 保有一个 `S2` 对象，即它们都保有一个哨位。
- 否则为 alt_x - alt_y ，其中 `alt_x` 与 `alt_y` 分别为 x.var 与 y.var 所保有的可选项（要么是两个迭代器，要么是一个迭代器与一个哨位）。

### 示例

    #include <algorithm>
    #include <iostream>
    #include <iterator>

    int main()
    {
        int a[] {0, 1, 2, 3, 4, 5};

        using CI = std::common_iterator<
                       std::counted_iterator<int*>,
                       std::default_sentinel_t
                       >;

        CI i1{ std::counted_iterator{ a + 1, 2 } };
        CI i2{ std::counted_iterator{ a + 1, 3 } };
        CI s1{ std::default_sentinel };
        CI s2{ std::default_sentinel };

        std::cout << (s2 - s1) << ' '
                  << (i2 - i1) << ' '
                  << (i1 - s1) << '\n';
    }

输出：

    0 -1 -2

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3574 | C++20 | `variant` 为完全 constexpr (P2231R1) 但 `common_iterator` 不是 | 亦使之为 constexpr

### 参阅

operator++operator++(int) (C++20) | 推进迭代器适配器 (公开成员函数)