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

From cppreference.com
< cpp‎ | utility‎ | expected
 
 
Utilities library
General utilities
Date and time
Function objects
Formatting library (C++20)
(C++11)
Relational operators (deprecated in C++20)
Integer comparison functions
(C++20)(C++20)(C++20)   
(C++20)
Swap and type operations
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Common vocabulary types
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Elementary string conversions
(C++17)
(C++17)
 
std::expected
Member functions
Observers
Monadic operations
Modifiers
expected::swap
(C++23)
Non-member functions
(C++23)
(C++23)
Helper classes
(C++23)
(C++23)(C++23)
 
constexpr void swap( expected& other ) noexcept(/*see below*/);
(since C++23)

Swaps the contents with those of other.

  • 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

Parameters

other - the optional object to exchange the contents with

Return value

(none)

Exceptions

If T is (possibly cv-qualified) void,
noexcept specification:  
Otherwise,

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

See also

specializes the std::swap algorithm
(function)