最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<expected>

# std::unexpected(C++23)

    namespace std {
      template<class E>
      class unexpected;
    }

## 概要

`unexpected`クラスは、`std::expected<T, E>`に格納される任意の型`E`のエラー値を表現するヘルパークラスである。

## 適格要件

型`E`は非オブジェクト型、配列型、`unexpected`の特殊化、CV修飾された型のいずれでもないこと。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++23
`(destructor)` | デストラクタ | C++23

### 代入

名前 | 説明 | 対応バージョン
--- | --- | ---
`constexpr unexpected& operator=(const unexpected&) = default;` | コピー代入演算子 | C++23
`constexpr unexpected& operator=(unexpected&&) = default;` | ムーブ代入演算子 | C++23
`swap` | 他の`unexpected`オブジェクトとデータを入れ替える | C++23

### 値の観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`error` | エラー値を取得する | C++23

### 比較

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++23
`operator!=` | 非等値比較 | C++23

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`swap` | 2つの`unexpected`オブジェクトを入れ替える | C++23

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++23

## 例

    #include <expected>
    #include <iomanip>
    #include <iostream>
    #include <string>

    // 整数除算
    std::expected<int, std::string> idiv(int a, int b)
    {
      if (b == 0) {
        return std::unexpected{"divide by zero"};
      }
      if (a % b != 0) {
        return std::unexpected{"out of domain"};
      }
      return a / b;
    }

    void dump_result(const std::expected<int, std::string>& v)
    {
      if (v) {
        std::cout << *v << std::endl;
      } else {
        std::cout << std::quoted(v.error()) << std::endl;
      }
    }

    int main()
    {
      dump_result(idiv(10, 2));
      dump_result(idiv(10, 3));
      dump_result(idiv(10, 0));
    }

### 出力

    5
    "out of domain"
    "divide by zero"

## バージョン

### 言語

- C++23

### 処理系

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

## 関連項目

- `expected`

## 参照

- P0323R12 std::expected
- P2549R1 `std::unexpected<E>` should have `error()` as member accessor