std::variant<Types...>::swap
提供: cppreference.com
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>) && ...))
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