// 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> == true
is_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());
}
13
#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++: ??