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

履歴 編集

function
<variant>

# std::swap (非メンバ関数)(C++17)

    namespace std {
      template <class... Types>
      void swap(variant<Types...>& x, variant<Types...>& y) noexcept(see below);            // C++17
      template <class... Types>
      constexpr void swap(variant<Types...>& x, variant<Types...>& y) noexcept(see below);  // C++23
    }

## 概要

同じ候補型をもつ2つの`variant`オブジェクトを入れ替える。

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

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

## 効果

以下と等価：

    x.swap(y);

## 戻り値

なし

## 例外

- `noexcept`内の式は、`noexcept(x.swap(y))`と等価

## 例

    #include <cassert>
    #include <variant>

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

      std::swap(a, 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`