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

履歴 編集

function template
<expected>

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

    // expected<cv void, E>部分特殊化
    // operator==により、下記オーバーロードが使用可能になる
    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)
    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 == y)`
- (2), (3) : `!(x == e)`

## 例

    #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{100};

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

      // (2), (3)
      assert(x2 != std::unexpected{2});
      assert(std::unexpected{2} != x2);
    }

### 出力

## バージョン

### 言語

- C++23

### 処理系

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

## 参照

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