std::expected<T,E>::swap
Материал из cppreference.com
<tbody>
</tbody>
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-квалифицированному)voidstd::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 (функция) |