Namespaces
Variants

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

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通の語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
void swap( variant& rhs ) noexcept(/* see below */);
(C++17以降)
(C++20からconstexpr)

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

  • もし *this と rhs の両方が例外により値なしの場合、何もしない。
  • そうでなく、もし *this と rhs の両方が同じ代わり値を保持している場合、swap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs))) を呼び出す。ここで i は index() である。例外が投げられた場合、値の状態は呼び出された swap 関数の例外安全性に依存する。
  • そうでなければ、rhs と *this の値を交換する。例外が投げられた場合、*this と rhs の状態は variant のムーブコンストラクタの例外安全性に依存する。

プログラムは、型 T_i が Swappable であり、かつ std::is_move_constructible_v<T_i> が true 内の全ての T_i に対して Types... である場合を除き、形式が不適格となる。

パラメータ

rhs - 交換する variant オブジェクト

戻り値

(なし)

例外

this - > index ( ) == rhs. index ( ) の場合、 swap ( * std:: get_if < i > ( this ) , * std:: get_if < i > ( std:: addressof ( rhs ) ) ) によって送出されるあらゆる例外を送出する可能性があります。ここで i は index() です。

それ以外の場合、現在 * this と rhs が保持している代替オプションのムーブコンストラクタによってスローされるあらゆる例外をスローする可能性があります。

noexcept 仕様:
noexcept ( ( ( std:: is_nothrow_move_constructible_v < Types > &&
std:: is_nothrow_swappable_v < Types > ) && ... ) )

注記

機能テスト マクロ 値 標準 機能
__cpp_lib_variant 202106L (C++20)
(DR)
完全な constexpr std::variant

例

#include <iostream>
#include <string>
#include <variant>
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

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2231R1 C++20 swap は constexpr ではなかったが、C++20では非自明なデストラクタが constexpr になり得る constexpr 化された

関連項目

std::swap アルゴリズムを特殊化する
(関数テンプレート)