std::expected<T,E>::operator=
Материал из cppreference.com
<tbody>
</tbody>
constexpr expected& operator=( const expected& other ); |
(1) | (начиная с C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/*смотрите ниже*/); |
(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.
1,2) Присваивает состояние
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-квалифицированным)voidstd::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, и- хотя бы одно из следующего истинно:
Tявляется (возможно, cv-квалифицированным)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- либо
3) Присваивает из ожидаемого значения.
- Если
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>>равно false, иstd::remove_cvref_t<U>не является специализациейstd::unexpected, иstd::is_constructible_v<T, U>равноtrue, иstd::is_assignable_v<T&, U>равноtrue, и- хотя бы одно из следующего
true:std::is_nothrow_constructible_v<T, U>std::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
4,5) Присваивает из неожидаемого значения.
Пусть 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-квалифицированному)voidstd::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
Исключения
1) Генерирует любое исключение, созданное конструктором копирования или оператором копирования
T или E.2) Если
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>)3) Генерирует любое исключение, созданное конструктором или оператором присваивания
T.4,5) Генерирует любое исключение, созданное конструктором или оператором присваивания
E.Пример
| Этот раздел не завершён Причина: нет примера |
Смотрите также
| создаёт ожидаемое значение на месте (public функция-элемент) |