std::expected<T,E>::operator=
constexpr expected& operator=( const expected& other ); | (1) | (с C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/*see below*/); | (2) | (с C++23) |
template< class U = T > constexpr expected& operator=( U&& v ); | (3) |
(с C++23) (T не является cv void) |
template< class G > constexpr expected& operator=( const unexpected<G>& other ); | (4) | (с C++23) |
template< class G > constexpr expected& operator=( unexpected<G>&& other ); | (5) | (с C++23) |
Присваивает новое значение существующему объекту expected.
other. - Если
this->has_value()равноother.has_value(), присваивает значение, содержащееся вother. Ничего не делает, еслиTявляется (возможно, с квалификатором cv)void, иother.has_value()равно true. - В противном случае уничтожает текущее значение (ничего не делает, если
this->has_value()равно true, иTявляется (возможно, с квалификатором cv)void), и заставляет*thisсодержать копию значения, содержащегося вother.
other.has_value() равно true и T является (возможно, с квалификатором cv) void, новое значение не конструируется. В противном случае новое значение копируется (1) или перемещается (2) из *other или other.error(), соответственно. Если возникает исключение, старое значение сохраняется; *this не становится бесзначным. Если исключение не было вызвано, после присваивания has_value() равно other.has_value().
- Перегрузка (1) определена как удалённая, если
- либо
Tявляется (возможно, с квалификатором cv)void, либоstd::is_copy_assignable_v<T>равно true, и - либо
Tявляется (возможно, с квалификатором cv)void, либоstd::is_copy_constructible_v<T>равно true, и -
std::is_copy_assignable_v<E>равно true, и -
std::is_copy_constructible_v<E>равно true, и - по крайней мере одно из следующего является true:
-
Tявляется (возможно, с квалификатором cv)void -
std::is_nothrow_move_constructible_v<T> -
std::is_nothrow_move_constructible_v<E>
-
- либо
- Перегрузка (2) участвует в разрешении перегрузки только если
- либо
Tявляется (возможно, с квалификатором cv)void, либоstd::is_move_assignable_v<T>равно true, и - либо
Tявляется (возможно, с квалификатором cv)void, либоstd::is_move_constructible_v<T>равно true, и -
std::is_move_assignable_v<E>равно 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>
-
- либо
- Если
this->has_value()равно true, эквивалентно**this = std::forward<U>(v). - В противном случае, уничтожает значение, содержащееся в
*this, и заставляет*thisсодержать значение, инициализированное изstd::forward<U>(v). Если возникает исключение, старое значение сохраняется;*thisне становится бесзначным.
Если исключение не было вызвано, после присваивания this->has_value() равно true.
- Эта перегрузка участвует в разрешении перегрузки только если
-
std::is_same_v<expected, std::remove_cvref_t<U>>ложно, и -
std::remove_cvref_t<U>не является специализациейstd::unexpected, и -
std::is_constructible_v<T, U>равно true, и -
std::is_assignable_v<T&, U>равно true, и - по крайней мере одно из следующего является true:
-
Пусть GF будет const G& для перегрузки (4) и G для перегрузки (5).
- Если
this->has_value()равно true, уничтожает значение, содержащееся в*this(ничего не делает, еслиTявляется (возможно, с квалификатором cv)void), и заставляет*thisсодержать значение, инициализированное изstd::forward<GF>(e.error()). Если возникает исключение, старое значение сохраняется;*thisне становится бесзначным. - В противном случае, эквивалентно
this->error() = std::forward<GF>(e.error()).
Если исключение не было вызвано, после присваивания this->has_value() равно false.
- Эта перегрузка участвует в разрешении перегрузки только если
-
std::is_constructible_v<E, GF>равно true, и -
std::is_assignable_v<E&, GF>равно true, и - по крайней мере одно из следующего является true:
-
Tявляется (возможно, с квалификатором cv)void -
std::is_nothrow_constructible_v<E, GF> -
std::is_nothrow_move_constructible_v<T> -
std::is_nothrow_move_constructible_v<E>
-
-
Во всех случаях, если T не является (возможно, с квалификатором cv) void, уничтожение старого значения и создание нового значения выполняется как если бы функцией по умолчанию была следующая 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;
}
}
}Параметры
| other | - | другой объект expected, содержащий значение для присваивания |
| value | - | значение для присваивания в содержащееся значение |
| e | - | объект std::unexpected, содержащий значение для присваивания |
Значение результата
*this
Исключения
T или E. T является (возможно, с квалификатором cv) void, noexcept спецификация: noexcept(std::is_nothrow_move_constructible_v<E> && std::is_nothrow_move_assignable_v<E>)noexcept спецификация: 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>)T. E. Пример
См. также
| создаёт значение expected на месте (публичный член-функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/expected/operator%3D