# operator==(std::common_iterator)

< cpp‎ | iterator‎ | common iterator

template <class I2, std::sentinel_for<I> S2> requires std::sentinel_for<S, I2> friend constexpr bool operator==( const common_iterator& x, const std::common_iterator<I2, S2>& y ); | (1) | (C++20 起)
template <class I2, std::sentinel_for<I> S2> requires std::sentinel_for<S, I2> && std::equality_comparable_with<I, I2> friend constexpr bool operator==( const common_iterator& x, const std::common_iterator<I2, S2>& y ); | (2) | (C++20 起)

比较底层 std::variant 成员对象 `var` 所保有的迭代器与/或哨位。认为二个不可比较的迭代器或二个哨位相等。

若 `x` 或 `y` 在非法状态，即 x.var.valueless_by_exception() || y.var.valueless_by_exception() 等于 true 则行为未定义。

令 `i` 为 x.var.index() ， `j` 为 y.var.index() 。

1) 若 i == j （即 x 与 y 均保有迭代器或哨位）则返回 true ，否则返回 std::get<i>(x.var) == std::get<j>(y.var) ；
2) 若 i == 1 && j == 1 （即 x 与 y 均保有哨位）则返回 true ，否则返回 std::get<i>(x.var) == std::get<j>(y.var) 。

`!=` 运算符从 `operator==` 合成。

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

### 参数

x, y | - | 要比较的迭代器适配器

### 返回值

若底层迭代器与/或哨位相等则为 true 。

### 示例

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

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

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

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

        std::cout << std::boolalpha
                  << (i1 == i2) << ' '   // true
                  << (i1 == i3) << ' '   // false
                  << (i2 == i3) << ' '   // false
                  << (s1 == s2) << ' '   // true
                  << (i1 == s1) << ' '   // false
                  << (i4 == s1) << '\n'; // true
    }

输出：

    true false false true false true

### 缺陷报告

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

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

### 参阅

operator- (C++20) | 计算二个迭代器适配器间的距离 (函数模板)