Spec-Zone.ru › C++

std::swap(std::optional)

Определено в заголовке <optional>
template< class T >
void swap( std::optional<T>& lhs,
           std::optional<T>& rhs ) noexcept(/* see below */);
(начиная с C++17)
(constexpr начиная с C++20)

Перегружает алгоритм std::swap для std::optional. Меняет состояние 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)))

Примечания

Макрос проверки функциональности Значение Стандарт Функциональность
__cpp_lib_optional 202106L (C++20)
(DR20)
Полностью constexpr

Пример

#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, хотя необходимые операции могут быть constexpr в C++20 сделан constexpr

См. также

swap
обменивает содержимое
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/optional/swap2

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API