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

履歴 編集

function
<expected>

std::expected.void::swap(C++23)

// expected<cv void, E>部分特殊化
constexpr void swap(expected& rhs) noexcept(see below);

概要

他のexpectedオブジェクトとデータを入れ替える。

動作説明用のexpectedクラスメンバ変数として、下記を導入する。

  • unex : E型のエラー値。
  • has_val : bool型のフラグ変数。正常値を保持する場合はtrueに、エラー値を保持する場合はfalseとなる。

テンプレートパラメータ制約

次の制約を全て満たすこと

効果

*thisrhsそれぞれが正常値/エラー値いずれを保持しているかに応じて、以下の効果を持つ。

  • *thisrhsともに正常値を保持していれば、なにもしない
  • *thisrhsともにエラー値を保持していれば、次と等価 : 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

処理系

参照