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

< cpp‎ | utility‎ | variant

void swap( variant& rhs ) noexcept(/* see below */); |  | (C++17 起) (C++20 前)
constexpr void swap( variant& rhs ) noexcept(/* see below */); |  | (C++20 起)

交换二个 `variant` 对象。

- 若 *this 和 `rhs` 均因异常无值，则不做任何事；
- 否则，若 *this 与 `rhs` 保有同一可选项，则调用 swap(std::get<i>(*this), std:get<i>(rhs)) ，其中 `i` 等于 `index()` 。若抛出异常，则值的状态依赖于被调用交换函数的异常安全；
- 否则，交换 `rhs` 与 *this 的值。若抛出异常，则 *this 与 `rhs` 的状态依赖于 `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

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
P2231R1 | C++20 | `swap` 不是 constexpr ，而要求的操作在 C++20 中能为 constexpr | 使之为 constexpr