std::variant<Types...>::swap
提供: cppreference.com
<tbody>
</tbody>
void swap( variant& rhs ) noexcept(/* see below */); |
(1) | (C++17以上) |
2つの variant オブジェクトを入れ替えます。
*thisとrhsがどちらも valueless by exception であれば、何もしません。- そうでなく、
*thisとrhsが同じ選択肢を保持していれば、swap(std::get<i>(*this), std:get<i>(rhs))を呼びます。 ただしiはindex()です。 例外が投げられた場合、値の状態は呼ばれた swap 関数の例外安全性保証によります。 - そうでなければ、
rhsと*thisの値を交換します。 例外が投げられた場合、*thisとrhsの状態は variant のムーブコンストラクタの例外安全性保証によります。
Types... 内のすべての T_i について、 T_i 型の左辺値が Swappable でないか、 std::is_move_constructible_v<T_i> が true でなければ、動作は未定義です。
引数
| rhs | - | 入れ替える variant オブジェクト |
戻り値
(なし)
例外
this->index() == rhs.index() の場合、 swap(std::get<i>(*this), std::get<i>(rhs)) (ただし i は index()) によって投げられるあらゆる例外を投げる可能性があります。
そうでなければ、現在 *this および rhs によって保持されている選択肢のムーブコンストラクタによって投げられるあらゆる例外を投げる可能性があります。
noexcept 指定:
noexcept(((std::is_nothrow_move_constructible_v<Types> && std::is_nothrow_swappable_v<Types>) && ...))例
Run this code
#include <variant>
#include <string>
#include <iostream>
int main()
{
std::variant<int, std::string> v1{2}, v2{"abc"};
std::visit([] (auto&& x) { std::cout << x << ' '; }, v1);
std::visit([] (auto&& x) { std::cout << x << '\n'; }, v2);
v1.swap(v2);
std::visit([] (auto&& x) { std::cout << x << ' '; }, v1);
std::visit([] (auto&& x) { std::cout << x << '\n'; }, v2);
}
出力:
2 abc
abc 2