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++: ??