table of contents
std::expected::swap(3) | C++ Standard Libary | std::expected::swap(3) |
NAME¶
std::expected::swap - std::expected::swap
Synopsis¶
constexpr void swap( expected& other ) noexcept(/*see below*/); (since C++23)
Swaps the contents with those of other.
* If both this->has_value() and other.has_value() are true:
* If T is (possibly cv-qualified) void, no effects.
* Otherwise, equivalent to using std::swap; swap(**this, *other);.
* If both this->has_value() and other.has_value() are false, equivalent to
using std::swap; swap(this->error(), other.error());.
* If this->has_value() is false and other.has_value() is true, calls
other.swap(*this).
* If this->has_value() is true and other.has_value() is false,
* If T is (possibly cv-qualified) void, let unex be the member that
represents the
unexpected value, equivalent to:
std::construct_at(std::addressof(unex), std::move(other.unex));
std::destroy_at(std::addressof(other.unex));
* Otherwise, let val be the member that represents the expected value and
unex be
the member that represents the unexpected value, equivalent to:
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;
}
}
* In either case, if no exception was thrown, after swap,
this->has_value() is
false, and other.has_value() is true.
This function participates in overload resolution only if
* either T is (possibly cv-qualified) void, or std::is_swappable_v<T>
is true, and
* std::is_swappable_v<E> is true, and
* either T is (possibly cv-qualified) void, or
std::is_move_constructible_v<T> is
true, and
* std::is_move_constructible_v<E> is true, and
* at least one of the following is true:
* T is (possibly cv-qualified) void
* std::is_nothrow_move_constructible_v<T>
* std::is_nothrow_move_constructible_v<E>
Parameters¶
other - the optional object to exchange the contents with
Return value¶
(none)
Exceptions¶
If T is (possibly cv-qualified) void,
noexcept specification:
noexcept(
std::is_nothrow_move_constructible_v<E> &&
std::is_nothrow_swappable_v<E>
)
Otherwise,
noexcept specification:
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>
)
In the case of thrown exception, the states of the contained values of *this
and
other are determined by the exception safety guarantees of swap or T's and
E's move
constructor, whichever is called. For both *this and other, if the object
contained
an expected value, it is left containing an expected value, and the other way
round.
Example¶
This section is incomplete
Reason: no example
See also¶
swap(std::expected) specializes the std::swap algorithm
(C++23) (function)
Categories:¶
* conditionally noexcept
* Todo no example
2024.06.10 | http://cppreference.com |