table of contents
std::expected::operator=(3) | C++ Standard Libary | std::expected::operator=(3) |
NAME¶
std::expected::operator= - std::expected::operator=
Synopsis¶
constexpr expected& operator=( const expected& other );
(1) (since C++23)
constexpr expected& operator=( expected&& other ) (2)
(since C++23)
noexcept(/*see below*/);
template< class U = T > (3) (since C++23)
constexpr expected& operator=( U&& v ); (T is not cv void)
template< class G > (4) (since C++23)
constexpr expected& operator=( const unexpected<G>& other );
template< class G > (5) (since C++23)
constexpr expected& operator=( unexpected<G>&& other );
Assigns a new value to an existing expected object.
1,2) Assigns the state of other.
* If this->has_value() equals other.has_value(), assigns the value
contained in
other. Does nothing if T is (possibly cv-qualified) void and
other.has_value()
is true.
* Otherwise, destroys the currently contained value (does nothing if
this->has_value() is true and T is (possibly cv-qualified) void), and
makes
*this contain a copy of the value contained in other.
If other.has_value() is true and T is (possibly cv-qualified) void, does not
construct the new value. Otherwise, the new value is copy-constructed
(1) or
move-constructed (2) from *other or other.error(), as appropriate. If
an exception
is thrown, the old value is retained; *this does not become valueless.
If no exception was thrown, after assignment, has_value() is equal to
other.has_value().
* Overload (1) is defined as deleted unless
* either T is (possibly cv-qualified) void or
std::is_copy_assignable_v<T> is
true, and
* either T is (possibly cv-qualified) void or
std::is_copy_constructible_v<T>
is true, and
* std::is_copy_assignable_v<E> is true, and
* std::is_copy_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>
* Overload (2) participates in overload resolution only if
* either T is (possibly cv-qualified) void or
std::is_move_assignable_v<T> is
true, and
* either T is (possibly cv-qualified) void or
std::is_move_constructible_v<T>
is true, and
* std::is_move_assignable_v<E> 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>
3) Assigns from expected value.
* If this->has_value() is true, equivalent to **this =
std::forward<U>(v).
* Otherwise, destroys the value contained in *this, and makes *this contain a
value initialized from std::forward<U>(v). If an exception is thrown,
the old
value is retained; *this does not become valueless.
If no exception was thrown, after assignment, this->has_value() is
true.
* This overload participates in overload resolution only if
* std::is_same_v<expected, std::remove_cvref_t<U>> is false, and
* std::remove_cvref_t<U> is not a specialization of std::unexpected,
and
* std::is_constructible_v<T, U> is true, and
* std::is_assignable_v<T&, U> is true, and
* at least one of the following is true:
* std::is_nothrow_constructible_v<T, U>
* std::is_nothrow_move_constructible_v<T>
* std::is_nothrow_move_constructible_v<E>
4,5) Assigns from unexpected value.
Let GF be const G& for overload (4), and G for overload
(5).
* If this->has_value() is true, destroys the value contained in *this
(does
nothing if T is (possibly cv-qualified) void), and makes *this contain a
value
initialized from std::forward<GF>(e.error()). If an exception is
thrown, the old
value is retained; *this does not become valueless.
* Otherwise, equivalent to this->error() =
std::forward<GF>(e.error()).
If no exception was thrown, after assignment, this->has_value() is
false.
* This overload participates in overload resolution only if
* std::is_constructible_v<E, GF> is true, and
* std::is_assignable_v<E&, GF> is true, and
* at least one of the following is true:
* T is (possibly cv-qualified) void
* std::is_nothrow_constructible_v<E, GF>
* std::is_nothrow_move_constructible_v<T>
* std::is_nothrow_move_constructible_v<E>
In all cases, if T is not (possibly cv-qualified) void, the destruction of
old value
and construction of new value is performed as if by the following
exposition-only
function reinit_expected.
template<class NewType, class OldType, class... Args>
constexpr void reinit_expected(NewType& new_val, OldType& old_val,
Args&&... args)
{
if constexpr (std::is_nothrow_constructible_v<NewType, Args...>)
{
std::destroy_at(std::addressof(old_val));
std::construct_at(std::addressof(new_val),
std::forward<Args>(args)...);
}
else if constexpr (std::is_nothrow_move_constructible_v<NewType>)
{
NewType temp(std::forward<Args>(args)...);
std::destroy_at(std::addressof(old_val));
std::construct_at(std::addressof(new_val), std::move(temp));
}
else
{
OldType temp(std::move(old_val));
std::destroy_at(std::addressof(old_val));
try
{
std::construct_at(std::addressof(new_val),
std::forward<Args>(args)...);
}
catch (...)
{
std::construct_at(std::addressof(old_val), std::move(temp));
throw;
}
}
}
Parameters¶
other - another expected object whose contained value to assign
value - value to assign to the contained value
e - std::unexpected object whose contained value to assign
Return value¶
*this
Exceptions¶
1) Throws any exception thrown by the copy constructor or copy
assignment operator
of T or E.
2) If T is (possibly cv-qualified) void,
noexcept specification:
noexcept(std::is_nothrow_move_constructible_v<E> &&
std::is_nothrow_move_assignable_v<E>)
Otherwise,
noexcept specification:
noexcept(
std::is_nothrow_move_constructible_v<T> &&
std::is_nothrow_move_assignable_v<T>
&&
std::is_nothrow_move_constructible_v<E> &&
std::is_nothrow_move_assignable_v<E>)
3) Throws any exception thrown by the constructor or assignment operator of
T.
4,5) Throws any exception thrown by the constructor or assignment operator of
E.
Example¶
This section is incomplete
Reason: no example
See also¶
emplace constructs the expected value in-place
(public member function)
Categories:¶
* conditionally noexcept
* Todo no example
2024.06.10 | http://cppreference.com |