# std::swap(std::optional)

< cpp‎ | utility‎ | optional

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

对 std::optional 重载 std::swap 算法。交换 `lhs` 与 `rhs` 的状态。等效地调用 lhs.swap(rhs) 。

此重载仅若 std::is_move_constructible_v<T> 与 std::is_swappable_v<T> 皆为true 才参与重载决议。

### 参数

lhs, rhs | - | 要交换状态的 `optional` 对象

### 返回值

（无）

### 异常

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

### 示例

    #include <iostream>
    #include <optional>
    #include <string>

    int main()
    {
        std::optional<std::string> a{"██████"}, b{"▒▒▒▒▒▒"};

        auto print = [&](auto const& s) {
            std::cout
                << s << "\t"
                << "a = " << a.value_or("(null)") << "  "
                << "b = " << b.value_or("(null)") << '\n';
        };

        print("Initially:");
        std::swap(a, b);
        print("swap(a, b):");
        a.reset();
        print("\n""a.reset():");
        std::swap(a, b);
        print("swap(a, b):");
    }

输出：

    Initially:     a = ██████  b = ▒▒▒▒▒▒
    swap(a, b):     a = ▒▒▒▒▒▒  b = ██████

    a.reset():      a = (null)  b = ██████
    swap(a, b):     a = ██████  b = (null)

### 缺陷报告

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

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

### 参阅

swap | 交换内容 (公开成员函数)