Пространства имён
Варианты
Действия

std::swap(std::optional)

Материал из cppreference.com
< cpp‎ | utility‎ | optional
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
std::optional
Функции-элементы
Наблюдатели
Монадические операции
Модификаторы
Функции, не являющиеся элементами
swap
Правила вывода
Вспомогательные классы
Вспомогательные объекты
 
Определено в заголовочном файле <optional>
template< class T >

void swap( std::optional<T>& lhs,

           std::optional<T>& rhs ) noexcept(/* смотрите ниже */);
(начиная с C++17)
(до C++20)
template< class T >

constexpr void swap( std::optional<T>& lhs,

                     std::optional<T>& rhs ) noexcept(/* смотрите ниже */);
(начиная с 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)))

[править] Пример

#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("Изначально:");
    std::swap(a, b);
    print("swap(a, b):");
    a.reset();
    print("\n""a.reset():");
    std::swap(a, b);
    print("swap(a, b):");
}

Вывод:

Изначально:	a = ██████  b = ▒▒▒▒▒▒
swap(a, b):	a = ▒▒▒▒▒▒  b = ██████
 
a.reset():	a = (null)  b = ██████
swap(a, b):	a = ██████  b = (null)

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
WG не указан C++20 swap не была constexpr, в то время как необходимые операции могут быть
constexpr в C++20
сделана constexpr

[править] Смотрите также

обменивает содержимое
(public функция-элемент) [править]