std::expected<T,E>::operator=
Материал из cppreference.com
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-квалифицированным) 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, и
- хотя бы одно из следующего истинно:
-
T
является (возможно, cv-квалифицированным) void - std::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:
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-квалифицированному) 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
[править] Исключения
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> &&
3) Генерирует любое исключение, созданное конструктором или оператором присваивания
T
.4,5) Генерирует любое исключение, созданное конструктором или оператором присваивания
E
.[править] Пример
Этот раздел не завершён Причина: нет примера |
[править] Смотрите также
создаёт ожидаемое значение на месте (public функция-элемент) |