expected[meta header]
class template[meta id-type]
std[meta namespace]
cpp23[meta cpp]
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>;
}
is_void_v[link /reference/type_traits/is_void.md]
expected
クラスは、任意の型T
の値を正常値とし任意の型E
の値をエラー値として、正常もしくはエラーいずれかの状態を取ることを値として表現できる型である。
このクラスは、ヒープからの動的メモリ確保を行わない。
実装は配置newのような機能によって、スタック領域のメモリのみを使用する。
型T
および型E
は、参照型、関数型、in_place_t
、unexpect_t
のいずれでもないこと。
型T
はunexpected
の特殊化ではないこと。
型T
が(CV修飾された)void
型でなければ、型T
はCpp17Destructible要件を満たすこと。
型E
は非オブジェクト型、配列型、unexpected
の特殊化、CV修飾された型のいずれでもないこと。
型E
はCpp17Destructible要件を満たすこと。
名前
説明
対応バージョン
operator=
代入演算子
C++23
emplace
正常値型のコンストラクタ引数から直接構築する
C++23
swap
他のexpected
オブジェクトとデータを入れ替える
C++23
メンバ関数(T=cv void 部分特殊化テンプレート)
(expected<cv void, E>
部分特殊化では、演算子オーバーロードoperator->
およびメンバ関数value_or
は提供されない。)
名前
説明
対応バージョン
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 ));
}
std::expected[color ff0000]
std::unexpected[link unexpected.md]
*v[link expected/op_deref.md]
v.error()[link expected/error.md]
std::quoted[link ../iomanip/quoted.md]
5
"out of domain"
"divide by zero"