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

std::optional<T>::swap

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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
Функции-элементы
Наблюдатели
Монадические операции
Модификаторы
Функции, не являющиеся элементами
Правила вывода
Вспомогательные классы
Вспомогательные объекты
 
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
void swap( optional& other ) noexcept(/* смотрите ниже */);
(начиная с C++17)
(до C++20)
constexpr void swap( optional& other ) noexcept(/* смотрите ниже */);
(начиная с C++20)

Меняет содержимое местами с other.

  • Если ни *this, ни other не содержат значения, функция не имеет эффекта.
  • Если только один из *this и other содержит значение (назовём этот объект in, а другой un), содержащееся значение un инициализируется напрямую из std::move(*in), с последующим уничтожением содержащегося в in значения, как если бы in->T::~T(). После этого вызова in не содержит значения; un содержит значение.
  • Если и *this, и other содержат значения, содержащиеся значения обмениваются вызовом using std::swap; swap(**this, *other). T значения lvalue должны соответствовать Swappable.

Программа некорректна, если std::is_move_constructible_v<T> равно false.

Параметры

other объект optional для обмена содержимым

Возвращаемое значение

(нет)

Исключения

спецификация noexcept:  
noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_swappable_v<T>)

В случае сгенерированного исключения состояния содержащихся значений *this и other определяются гарантиями безопасности исключения swap типа T или конструктора перемещения T, в зависимости от того, что вызывается. Как для *this, так и для other, если объект содержит значение, он остаётся со значением, и наоборот.

Пример

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

int main()
{
    std::optional<std::string> opt1("Текст первого примера");
    std::optional<std::string> opt2("2-й текст");

    enum Swap { Before, After };
    auto print_opts = [&](Swap e) {
        std::cout << (e == Before ? "Перед обменом:\n" : "После обмена:\n");
        std::cout << "opt1 содержит '" << opt1.value_or("") << "'\n";
        std::cout << "opt2 содержит '" << opt2.value_or("") << "'\n";
        std::cout << (e == Before ? "---ОБМЕН---\n": "\n");
    };

    print_opts(Before);
    opt1.swap(opt2);
    print_opts(After);

    // Обмен только с 1 набором
    opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt.";
    opt2.reset();

    print_opts(Before);
    opt1.swap(opt2);
    print_opts(After);
}

Вывод:

Перед обменом:
opt1 содержит 'Текст первого примера'
opt2 содержит '2-й текст'
---ОБМЕН---
После обмена:
opt1 содержит '2-й текст'
opt2 содержит 'Текст первого примера'

Перед обменом:
opt1 содержит 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
opt2 содержит ''
---ОБМЕН---
После обмена:
opt1 содержит ''
opt2 содержит 'Lorem ipsum dolor sit amet, consectetur tincidunt.'

Отчёты о дефектах

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

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

Смотрите также

специализация алгоритма std::swap
(шаблон функции) [править]