最終更新日時(UTC):
が更新

履歴 編集

class template
<expected>

std::expected(C++23)

namespace std {
  // プライマリテンプレート
  template<class T, class E>
  class expected;

  // T=cv void 部分特殊化テンプレート
  template<class T, class E>
    requires is_void_v<T>
  class expected<T, E>;
}

概要

expectedクラスは、任意の型Tの値を正常値とし任意の型Eの値をエラー値として、正常もしくはエラーいずれかの状態を取ることを値として表現できる型である。

このクラスは、ヒープからの動的メモリ確保を行わない。 実装は配置newのような機能によって、スタック領域のメモリのみを使用する。

適格要件

  • Tおよび型Eは、参照型、関数型、in_place_tunexpect_tのいずれでもないこと。
  • Tunexpectedの特殊化ではないこと。
  • Tが(CV修飾された)void型でなければ、型TはCpp17Destructible要件を満たすこと。
  • Eは非オブジェクト型、配列型、unexpectedの特殊化、CV修飾された型のいずれでもないこと。
  • EはCpp17Destructible要件を満たすこと。

メンバ関数(プライマリテンプレート)

構築・破棄

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

代入

名前 説明 対応バージョン
operator= 代入演算子 C++23
emplace 正常値型のコンストラクタ引数から直接構築する C++23
swap 他のexpectedオブジェクトとデータを入れ替える C++23

値の観測

名前 説明 対応バージョン
operator-> 正常値へのメンバアクセス C++23
operator* 正常値への間接参照 C++23
operator bool 正常値を保持しているかを判定する C++23
has_value 正常値を保持しているかを判定する C++23
value 正常値を取得する C++23
error エラー値を取得する C++23
value_or 正常値もしくは指定された値を取得する C++23
error_or エラー値もしくは指定された値を取得する C++23

モナド操作

名前 説明 対応バージョン
and_then 正常値に対して関数を適用する C++23
or_else エラー値に対して関数を適用する C++23
transform 正常値を変換する C++23
transform_error エラー値を変換する C++23

比較

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

メンバ関数(T=cv void 部分特殊化テンプレート)

構築・破棄

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

代入

名前 説明 対応バージョン
operator= 代入演算子 C++23
emplace 正常値を保持する C++23
swap 他のexpectedオブジェクトとデータを入れ替える C++23

値の観測

名前 説明 対応バージョン
operator* 正常値への間接参照 C++23
operator bool 正常値を保持しているかを判定する C++23
has_value 正常値を保持しているかを判定する C++23
value 正常値を取得する C++23
error エラー値を取得する C++23
error_or エラー値もしくは指定された値を取得する C++23

expected<cv void, E> 部分特殊化では、演算子オーバーロードoperator->およびメンバ関数value_orは提供されない。)

モナド操作

名前 説明 対応バージョン
and_then 正常値に対して関数を適用する C++23
or_else エラー値に対して関数を適用する C++23
transform 正常値を変換する C++23
transform_error エラー値を変換する C++23

比較

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

メンバ型

名前 説明 対応バージョン
value_type 正常値の型T C++23
error_type エラー値の型E C++23
unexpected_type unexpected<E> C++23
template<class U> rebind expected<U, error_type> C++23

非メンバ関数

名前 説明 対応バージョン
swap 2つのexpected<T, E>オブジェクトを入れ替える C++23
swap 2つのexpected<cv void, E>オブジェクトを入れ替える 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

処理系

関連項目

参照