# std::swap(std::variant)

< cpp‎ | utility‎ | variant

定义于头文件 `<variant>` |  |
template <class... Types> void swap( std::variant<Types...>& lhs, std::variant<Types...>& rhs ) noexcept(/* see below */); |  | (C++17 起) (C++20 前)
template <class... Types> constexpr void swap( std::variant<Types...>& lhs, std::variant<Types...>& rhs ) noexcept(/* see below */); |  | (C++20 起)

为 std::variant 重载 std::swap 算法。等效地调用 lhs.swap(rhs) 。

此重载仅若 std::is_move_constructible_v<T_i> 与 std::is_swappable_v<T_i> 对于所有 `Types...` 中的 `T_i` 皆为 true 才参与重载决议。

### 参数

lhs, rhs | - | 要交换值的 `variant` 对象

### 返回值

（无）

### 异常

`noexcept` 说明：
noexcept(noexcept(lhs.swap(rhs)))

### 示例

    #include <variant>
    #include <string>
    #include <iostream>

    auto print = [](auto const& v, char term = '\n') {
        std::visit([](auto&& o) { std::cout << o; }, v);
        std::cout << term;
    };

    int main()
    {
        std::variant<int, std::string> v1{123}, v2{"XYZ"};
        print(v1, ' ');
        print(v2);

        std::swap(v1, v2);
        print(v1, ' ');
        print(v2);

        std::variant<double, std::string> v3{3.14};
        // std::swap(v1, v3); // 错误： ~ 不一致的形参包
    }

输出：

    123 XYZ
    XYZ 123

### 缺陷报告

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

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

### 参阅

swap | 与另一 `variant` 交换 (公开成员函数)