std::expected<T,E>::swap
Материал из cppreference.com
constexpr void swap( expected& other ) noexcept(/*смотрите ниже*/); |
(начиная с C++23) | |
Обменивает содержимое с other
.
- Если оба
this->has_value()
иother.has_value()
равны true:
- Если
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.
- В любом случае, если исключение не было сгенерировано, после обмена
Эта функция участвует в разрешении перегрузки, только если
- либо
T
равно (возможно, cv-квалифицированному) void, или std::is_swappable_v<T> равно true, и - std::is_swappable_v<E> равно true, и
- либо
T
является (возможно, cv-квалифицированным) void, или std::is_move_constructible_v<T> равно true, и - std::is_move_constructible_v<E> равно true, и
- хотя бы одно из следующего true:
-
T
равно (возможно, cv-квалифицированному) void - std::is_nothrow_move_constructible_v<T>
- std::is_nothrow_move_constructible_v<E>
-
Содержание |
[править] Параметры
other | — | объект optional для обмена содержимым
|
[править] Возвращаемое значение
(нет)
[править] Исключения
ЕслиT
(возможно, cv-квалифицированный) void, спецификация noexcept:
Иначе, noexcept(
std::is_nothrow_move_constructible_v<E> && std::is_nothrow_swappable_v<E>
спецификация noexcept:
noexcept(
std::is_nothrow_move_constructible_v<T> && std::is_nothrow_swappable_v<T> &&
std::is_nothrow_move_constructible_v<E> && std::is_nothrow_swappable_v<E>
В случае сгенерированного исключения состояния содержащихся значений *this и other
определяются гарантиями безопасности исключений swap
или конструктора перемещения T
и E
, в зависимости от того, какой из них вызывается. Как для *this, так и для other
, если объект содержит ожидаемое значение, он остается содержащим ожидаемое значение, и наоборот.
[править] Пример
Этот раздел не завершён Причина: нет примера |
[править] Смотрите также
(C++23) |
специализация алгоритма std::swap (функция) |