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

std::expected<T,E>::swap

Материал из cppreference.com
< cpp‎ | utility‎ | expected
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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::expected
Функции-элементы
Наблюдатели
Монадические операции
Модификаторы
expected::swap
Функции, не являющиеся элементами
Вспомогательные классы
 
constexpr void swap( expected& other ) noexcept(/*смотрите ниже*/);
(начиная с C++23)

Обменивает содержимое с other.

  • Если T является (возможно, cv-квалифицированным) void, не имеет эффектов.
  • Иначе эквивалентно using std::swap; swap(*this, other);.
  • Если и this->has_value() и other.has_value() равны false, эквивалентно
    using std::swap; swap(this->error(), other.error());.
  • Если this->has_value() равно false, а other.has_value() равно true, вызывает other.swap(*this).
  • Если this->has_value() равно true, а other.has_value() равно false,
  • Если T является (возможно, cv-квалифицированным) void, пусть unex будет элементом, представляющим неожидаемое значение, эквивалентно:
std::construct_at(std::addressof(unex), std::move(other.unex));
std::destroy_at(std::addressof(other.unex));
  • Иначе пусть val будет элементом, представляющим ожидаемое значение, а unex будет элементом, представляющим ожидаемое значение, эквивалентное следующему:
if constexpr (std::is_nothrow_move_constructible_v<E>) {
    E temp(std::move(other.unex));
    std::destroy_at(std::addressof(other.unex));
    try {
        std::construct_at(std::addressof(other.val), std::move(val));
        std::destroy_at(std::addressof(val));
        std::construct_at(std::addressof(unex), std::move(temp));
    } catch(...) {
        std::construct_at(std::addressof(other.unex), std::move(temp));
        throw;
    }
} else {
    T temp(std::move(val));
    std::destroy_at(std::addressof(val));
    try {
        std::construct_at(std::addressof(unex), std::move(other.unex));
        std::destroy_at(std::addressof(other.unex));
        std::construct_at(std::addressof(other.val), std::move(temp));
    } catch(...) {
        std::construct_at(std::addressof(val), std::move(temp));
        throw;
    }
}
  • В любом случае, если исключение не было сгенерировано, после обмена this->has_value() равно false, а other.has_value() равно true.

Эта функция участвует в разрешении перегрузки, только если

Содержание

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

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

[править] Возвращаемое значение

(нет)

[править] Исключения

Если T (возможно, cv-квалифицированный) void,
спецификация noexcept:  
Иначе,

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

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

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

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