Namespaces
Variants

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

From cppreference.net
Utilities library
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 について型 T_i Swappable であり、かつ std:: is_move_constructible_v < T_i > true である場合を除き、不適格です。

目次

**翻訳の説明:** - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、リンク先は一切変更していません - C++関連の専門用語(Parameters、Return value、Exceptions、Notes、Example、Defect reports、See also)は原文のまま保持しています - 番号部分の書式は完全に維持しています - プロフェッショナルな技術文書としての正確性を保っています

パラメータ

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 アルゴリズムを特殊化する
(関数テンプレート)