std::expected<T,E>::operator=
constexpr expected& operator=( const expected& other ); |
(1) | (desde C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/*véase abajo*/); |
(2) | (desde C++23) |
template< class U = std::remove_cv_t<T> > constexpr expected& operator=( U&& v ); |
(3) | (desde C++23) (T no es cv void) |
template< class G > constexpr expected& operator=( const unexpected<G>& other ); |
(4) | (desde C++23) |
template< class G > constexpr expected& operator=( unexpected<G>&& other ); |
(5) | (desde C++23) |
Asigna un nuevo valor a un objeto expected existente.
other.
- Si
this->has_value()es igual aother.has_value(), asigna el valor contenido enother. No hace nada siTes (posiblemente calificado con cv)voidyother.has_value()estrue. - De lo contrario, destruye el valor contenido actualmente (no hace nada si
this->has_value()estrueyTes (posiblemente calificado con cv)void), y hace que*thiscontenga una copia del valor contenido enother.
- Si
other.has_value()estrueyTes (posiblemente calificado con cv)void, no construye el nuevo valor. En caso contrario, el nuevo valor se construye por copia (1) o se construye por movimiento (2) a partir de*otheroother.error(), según corresponda. Si se lanza una excepción, se conserva el valor anterior;*thisno queda sin valor.
Si no se lanzó ninguna excepción tras la asignación, has_value() es igual a other.has_value().
- La sobrecarga (1) se define como eliminada, a menos que
- o
Tes (posiblemente calificado con cv)voidostd::is_copy_assignable_v<T>estrue, y - o
Tes (posiblemente calificado con cv)voidostd::is_copy_constructible_v<T>estrue, y std::is_copy_assignable_v<E>estrue, ystd::is_copy_constructible_v<E>estrue, y- al menos uno de los siguientes es
true:Tes (posiblemente calificado con cv)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- o
- La sobrecarga (2) participa en la resolución de sobrecargas solo si
- o
Tes (posiblemente calificado con cv)voidostd::is_move_assignable_v<T>estrue, y - o
Tes (posiblemente calificado con cv)voidostd::is_move_constructible_v<T>estrue, y std::is_move_assignable_v<E>estrue, ystd::is_move_constructible_v<E>estrue, y- al menos uno de los siguientes es
true:Tes (posiblemente calificado con cv)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- o
- Si
this->has_value()estrue, es equivalente a**this = std::forward<U>(v). - De lo contrario, destruye el valor contenido en
*this, y hace que*thiscontenga un valor inicializado a partir destd::forward<U>(v). Si se lanza una excepción, se conserva el valor anterior;*thisno se vuelve sin valor.
Si no se lanza ninguna excepción, this->has_value() es true después de la asignación.
- Esta sobrecarga solo participa en la resolución de sobrecargas si
std::is_same_v<expected, std::remove_cvref_t<U>>esfalse, ystd::remove_cvref_t<U>no es una especialización destd::unexpected, ystd::is_constructible_v<T, U>estrue, ystd::is_assignable_v<T&, U>estrue, y- al menos uno de los siguientes es
true:std::is_nothrow_constructible_v<T, U>std::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
Sea GF const G& para la sobrecarga (4), y G para la sobrecarga (5).
- Si
this->has_value()estrue, destruye el valor contenido en*this(no hace nada siTes (posiblemente calificado con cv)void), y hace que*thiscontenga un valor inicializado a partir destd::forward<GF>(e.error()). Si se lanza una excepción, se conserva el valor anterior;*thisno pierde su valor. - De lo contrario, es equivalente a
this->error() = std::forward<GF>(e.error()).
Si no se lanzó ninuna excepción, this->has_value() es false después de la asignación.
- Esta sobrecarga solo participa en la resolución de sobrecargas si
std::is_constructible_v<E, GF>estrue, ystd::is_assignable_v<E&, GF>estrue, y- al menos uno de los siguientes es
true:Tes (posiblemente calificado con cv)voidstd::is_nothrow_constructible_v<E, GF>std::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
En todos los casos, si T no es void (posiblemente calificado con cv), la destrucción del valor antiguo y la construcción del valor nuevo se realizan como si fuera mediante la siguiente función reinit_expected (exclusiva para fines de exposición).
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)...); // puede lanzar
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)...); // puede lanzar
}
catch (...)
{
std::construct_at(std::addressof(old_val), std::move(temp));
throw;
}
}
}
Sumario
Parámetros
| other | - | Otro objeto expected cuyo valor contenido se asignará.
|
| value | - | Valor que se asignará al valor contenido. |
| e | - | Objeto std::unexpected cuyo valor contenido se asignará. |
Valor de retorno
*this
Excepciones
T o E.T es (posiblemente calificado con cv) void, noexcept(std::is_nothrow_move_constructible_v<E> && std::is_nothrow_move_assignable_v<E>)
|
||
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.Ejemplo
| Esta sección está incompleta Razón: sin ejemplo |
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3886 | C++23 | El argumento de plantilla por defecto de la sobrecarga (3) era T.
|
Se cambió a std::remove_cv_t<T>.
|
| LWG 4025 | C++23 | La asignación por movimiento (2) de std::expected<void, E> estabadefinida como eliminada si E no es construible por movimiento ni asignable por movimiento.
|
No participa en la resolución de sobrecargas en este caso. |
Véase también
| Construye el valor esperado in situ. (función miembro pública) |