最終更新日時: 2025年07月14日 23時04分00秒 (JST)
Koichi Murase が更新

履歴 編集

function
<variant>

# std::variant::swap(C++17)

    void swap(variant& rhs) noexcept(see below);            // C++17
    constexpr void swap(variant& rhs) noexcept(see below);  // C++23

## 概要

他の`variant`オブジェクトとデータを入れ替える。

## テンプレートパラメータ制約

- `Types...`に含まれる全ての型`Ti`について、`is_swappable_v<Ti>`が`true`、かつ`is_move_constructible_v<Ti>`が`true`であること

## 効果

- `valueless_by_exception() && rhs.valueless_by_exception()`が`true`である場合、なにもしない (どちらも空)
- `index() == rhs.index()`である場合、そのインデックス値を`I`として、`swap(get<I>(*this), get<I>(rhs))`を呼び出す
- いずれにも当てはまらない場合、`rhs`と`*this`の状態を入れ替える

## 戻り値

なし

## 例外

- `index() == rhs.index()`である場合、そのインデックスの型を`Ti`として、`Ti`型同士の`swap`操作が任意の例外を送出する可能性がある。そうでない場合、`*this`が保持する型を`Ti`、`rhs`が保持する型を`Tj`として、`Ti`と`Tj`のムーブコンストラクタが任意の例外を送出する可能性がある
- `swap(get<I>(*this), get<I>(rhs))`の呼び出し中に例外が発生した場合、`*this`と`rhs`は、`Ti`型の`swap`操作がもつ例外安全性が保証する状態となる
- それ以外の状態での`*this`と`rhs`の入れ替え中に例外が発生した場合、`*this`と`rhs`の状態は、`variant`のムーブコンストラクタの例外安全保証によって決まる
- `noexcept`内の式は、`Types...`の全ての型`Ti`について、`is_nothrow_move_constructible_v<Ti> && is_nothrow_swappable_v<Ti>`を論理積としたものと等価になる

## 例

    #include <cassert>
    #include <variant>

    int main()
    {
      std::variant<int, char, double> a = 1;
      std::variant<int, char, double> b = 3.14;

      a.swap(b);

      assert(std::holds_alternative<double>(a));
      assert(std::holds_alternative<int>(b));

      assert(std::get<double>(a) == 3.14);
      assert(std::get<int>(b) == 1);
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- Visual C++: ??

## 参照

- P2231R1 Missing `constexpr` in `std::optional` and `std::variant`