// expected<cv void, E>部分特殊化
constexpr void swap(expected& rhs) noexcept(see below);
概要
他のexpectedオブジェクトとデータを入れ替える。
動作説明用のexpectedクラスメンバ変数として、下記を導入する。
unex:E型のエラー値。has_val:bool型のフラグ変数。正常値を保持する場合はtrueに、エラー値を保持する場合はfalseとなる。
テンプレートパラメータ制約
次の制約を全て満たすこと
is_swappable_v<E> == trueis_move_constructible_v<E> == true
効果
*thisとrhsそれぞれが正常値/エラー値いずれを保持しているかに応じて、以下の効果を持つ。
*thisとrhsともに正常値を保持していれば、なにもしない*thisとrhsともにエラー値を保持していれば、次と等価 :using std::swap; swap(unex, rhs.unex);*thisがエラー値をrhsが正常値を保持していれば、次と等価 :rhs.swap(*this);*thisが正常値をrhsがエラー値を保持していれば、次と等価 :
construct_at(addressof(unex), std::move(rhs.unex)); destroy_at(addressof(rhs.unex)); has_val = false; rhs.has_val = true;
戻り値
なし
例外
noexcept例外指定は次の式に従う :
is_nothrow_move_constructible_v<E> && is_nothrow_swappable_v<E>
noexcept例外指定がfalseの場合、上記の「効果」による処理からの例外がスローされる。
例
#include <cassert>
#include <expected>
int main()
{
std::expected<void, int> x;
std::expected<void, int> y = std::unexpected{42};
assert(x.has_value() && y.error() == 42);
x.swap(y);
assert(x.error() == 42 && y.has_value());
}
出力
バージョン
言語
- C++23
処理系
- Clang: 16.0 ✅
- GCC: 12.1 ✅
- ICC: ??
- Visual C++: ??