void swap(variant& rhs) noexcept(see below); // C++17
constexpr void swap(variant& rhs) noexcept(see below); // C++23
概要
他のvariantオブジェクトとデータを入れ替える。
テンプレートパラメータ制約
Types...に含まれる全ての型Tiについて、is_swappable_v<Ti>がtrue、かつis_move_constructible_v<Ti>がtrueであること
効果
valueless_by_exception() && rhs.valueless_by_exception()がtrueである場合、なにもしない (どちらも空)index() == rhs.index()である場合、そのインデックス値をIとして、swap(get<I>(*this), get<I>(rhs))を呼び出す- いずれにも当てはまらない場合、
rhsと*thisの状態を入れ替える
戻り値
なし
例外
index() == rhs.index()である場合、そのインデックスの型をTiとして、Ti型同士のswap操作が任意の例外を送出する可能性がある。そうでない場合、*thisが保持する型をTi、rhsが保持する型をTjとして、TiとTjのムーブコンストラクタが任意の例外を送出する可能性があるswap(get<I>(*this), get<I>(rhs))の呼び出し中に例外が発生した場合、*thisとrhsは、Ti型のswap操作がもつ例外安全性が保証する状態となる- それ以外の状態での
*thisとrhsの入れ替え中に例外が発生した場合、*thisとrhsの状態は、variantのムーブコンストラクタの例外安全保証によって決まる noexcept内の式は、Types...の全ての型Tiについて、is_nothrow_move_constructible_v<Ti> && is_nothrow_swappable_v<Ti>を論理積としたものと等価になる
例
#include <cassert>
#include <variant>
int main()
{
std::variant<int, char, double> a = 1;
std::variant<int, char, double> b = 3.14;
a.swap(b);
assert(std::holds_alternative<double>(a));
assert(std::holds_alternative<int>(b));
assert(std::get<double>(a) == 3.14);
assert(std::get<int>(b) == 1);
}
出力
バージョン
言語
- C++17
処理系
- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- Visual C++: ??