名前空間
変種
操作

std::variant<Types...>::swap

提供: cppreference.com
< cpp‎ | utility‎ | variant
 
 
 
 
void swap( variant& rhs ) noexcept(/* see below */);
(1) (C++17以上)

2つの variant オブジェクトを入れ替えます。

  • *thisrhs がどちらも valueless by exception であれば、何もしません。
  • そうでなく、 *thisrhs が同じ選択肢を保持していれば、 swap(std::get<i>(*this), std:get<i>(rhs)) を呼びます。 ただし iindex() です。 例外が投げられた場合、値の状態は呼ばれた swap 関数の例外安全性保証によります。
  • そうでなければ、 rhs*this の値を交換します。 例外が投げられた場合、 *thisrhs の状態は 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>) && ...))

[編集]

#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