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

履歴 編集

function template
<expected>

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

    // expected<cv void, E>部分特殊化
    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 E2>
    friend constexpr bool operator==(const expected& x, const unexpected<E2>& e);   // (2)
    // (2)により、下記オーバーロードが使用可能になる
    template<class E2>
    friend constexpr bool operator==(const unexpected<E2>& e, const expected& x);   // (3)

## 概要

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

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

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

## 戻り値

- (1) : 次の値を返す
  - `x.has_value()`と`y.has_value()`が異なるとき、`false`
  - そうでなければ、`x.has_value() || static_cast<bool>(x.error() == y.error())`
- (2), (3) : `!x.has_value() && static_cast<bool>(x.error() == e.error())`

## 例

    #include <cassert>
    #include <expected>

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

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

      // (2), (3)
      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で「適格要件」を「テンプレートパラメータ制約」に変更