最終更新日時(UTC): 2025年02月28日 01時18分32秒
Akira Takahashi が更新

履歴 編集

function template
<expected>

# std::expected::operator==(C++23)

    template<class T2, class E2> requires (!is_void_v<T2>)
    friend constexpr bool operator==(const expected& x, const expected<T2, E2>& y); // (1)

    template<class T2>
    friend constexpr bool operator==(const expected& x, const T2& v); // (2)
    // (2)により、下記オーバーロードが使用可能になる
    template<class T2>
    friend constexpr bool operator==(const T2& v, const expected& x); // (3)

    template<class E2>
    friend constexpr bool operator==(const expected& x, const unexpected<E2>& e); // (4)
    // (4)により、下記オーバーロードが使用可能になる
    template<class E2>
    friend constexpr bool operator==(const unexpected<E2>& e, const expected& x); // (5)

## 概要

- (1) : `expected`オブジェクト同士の等値比較を行う。
- (2), (3) : `expected`オブジェクトと正常値の等値比較を行う。
- (4), (5) : `expected`オブジェクトとエラー値の等値比較を行う。

## テンプレートパラメータ制約

- (1) : 式`*x == *y`および式`x.error() == y.error()`が適格であり、各式の結果を`bool`へ変換可能であること。
- (2), (3) : 式`*x == v`が適格であり、その結果を`bool`へ変換可能であること。
- (4), (5) : 式`x.error() == e.error()`が適格であり、その結果を`bool`へ変換可能であること。

## 戻り値

- (1) : 次の値を返す
  - `x.has_value()`と`y.has_value()`が異なるとき、`false`
  - `x.has_value() == true`のとき、`*x == *y`
  - `x.error() == y.error()`
- (2), (3) : `x.has_value() && static_cast<bool>(*x == v)`
- (4), (5) : `!x.has_value() && static_cast<bool>(x.error() == e.error())`

## 例

    #include <cassert>
    #include <expected>

    int main()
    {
      std::expected<long, long>   x1 = 1;
      std::expected<short, short> y1 = 1;
      std::expected<long, long>   x2 = std::unexpected{1};
      std::expected<short, short> y2 = std::unexpected{1};

      // (1)
      assert(x1 == y1);
      assert(x2 == y2);
      assert(not (x1 == y2));
      assert(not (x2 == y1));

      // (2), (3)
      assert(x1 == 1);
      assert(1 == x1);

      // (4), (5)
      assert(x2 == std::unexpected{1});
      assert(std::unexpected{1} == x2);
    }

### 出力

## バージョン

### 言語

- C++23

### 処理系

- Clang: 16.0 ✅
- GCC: 12.1 ✅
- ICC: ??
- Visual C++: ??

## 参照

- P0323R12 std::expected
- P3379R0 Constrain `std::expected` equality operators
  - C++26で「適格要件」を「テンプレートパラメータ制約」に変更