Spec-Zone.ru › C++

std::optional<T>::swap

void swap( optional& other ) noexcept(/* see below */);
(с C++17)
(до C++20)
constexpr void swap( optional& other ) noexcept(/* see below */);
(с 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 lvalues должны удовлетворять требованиям 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("First example text");
    std::optional<std::string> opt2("2nd text");
 
    enum Swap { Before, After };
    auto print_opts = [&](Swap e) {
        std::cout << (e == Before ? "Before swap:\n" : "After swap:\n");
        std::cout << "opt1 contains '" << opt1.value_or("") << "'\n";
        std::cout << "opt2 contains '" << opt2.value_or("") << "'\n";
        std::cout << (e == Before ? "---SWAP---\n": "\n");
    };
 
    print_opts(Before);
    opt1.swap(opt2);
    print_opts(After);
 
    // Swap with only 1 set
    opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt.";
    opt2.reset();
 
    print_opts(Before);
    opt1.swap(opt2);
    print_opts(After);
}

Вывод:

Before swap:
opt1 contains 'First example text'
opt2 contains '2nd text'
---SWAP---
After swap:
opt1 contains '2nd text'
opt2 contains 'First example text'
 
Before swap:
opt1 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
opt2 contains ''
---SWAP---
After swap:
opt1 contains ''
opt2 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применимо к Поведение, опубликованное Правильное поведение
P2231R1 C++20 swap не было constexpr, в то время как требуемые операции могут быть constexpr в C++20 сделано constexpr

См. также

std::swap(std::optional)
(C++17)
специализация алгоритма std::swap
(шаблон функции)

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

Spec-Zone.ru

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