std::expected<T,E>::operator=
constexpr expected& operator=( const expected& other );
|
(1) | (desde C++23) |
constexpr expected& operator=( expected&& other ) noexcept(/*see below*/);
|
(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 cv-cualificado)voidyother.has_value()estrue. - En caso contrario, destruye el valor actualmente contenido (no hace nada si
this->has_value()estrueyTes (posiblemente cv-cualificado)void), y hace que*thiscontenga una copia del valor contenido enother.
- Si
other.has_value()estrueyTes (posiblemente cv-cualificado)void, no construye el nuevo valor. En caso contrario, el nuevo valor se construye por copia (1) o por movimiento (2) desde*otheroother.error(), según corresponda. Si se lanza una excepción, se retiene el valor antiguo;*thisno se vuelve sin valor.
Si no se lanzó ninguna excepción, después de la asignación, has_value() es igual a other.has_value().
- La sobrecarga (1) se define como eliminada a menos que
- ya sea
Tes (posiblemente cv-cualificado)voidostd::is_copy_assignable_v<T>estrue, y - ya sea
Tes (posiblemente cv-cualificado)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 una de las siguientes condiciones es
true:Tes (posiblemente cv-cualificado)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- ya sea
- La sobrecarga (2) participa en la resolución de sobrecarga solo si
- ya sea
Tes (posiblemente cv-cualificado)voidostd::is_move_assignable_v<T>estrue, y - ya sea
Tes (posiblemente cv-cualificado)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 una de las siguientes condiciones es
true:Tes (posiblemente cv-cualificado)voidstd::is_nothrow_move_constructible_v<T>std::is_nothrow_move_constructible_v<E>
- ya sea
- Si
this->has_value()estrue, equivalente a**this = std::forward<U>(v). - En caso contrario, destruye el valor contenido en
*this, y hace que*thiscontenga un valor inicializado desdestd::forward<U>(v). Si se lanza una excepción, se retiene el valor antiguo;*thisno se vuelve sin valor.
Si no se lanzó ninguna excepción, después de la asignación, this->has_value() es true.
- Esta sobrecarga participa en la resolución de sobrecarga solo 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 una de las siguientes condiciones 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 cv-cualificado)void), y hace que*thiscontenga un valor inicializado desdestd::forward<GF>(e.error()). Si se lanza una excepción, se retiene el valor antiguo;*thisno se vuelve sin valor. - En caso contrario, equivalente a
this->error() = std::forward<GF>(e.error()).
Si no se lanzó ninguna excepción, después de la asignación, this->has_value() es false.
- Esta sobrecarga participa en la resolución de sobrecarga solo si
std::is_constructible_v<E, GF>estrue, ystd::is_assignable_v<E&, GF>estrue, y- al menos una de las siguientes condiciones es
true:Tes (posiblemente cv-cualificado)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 (posiblemente cv-cualificado) void, la destrucción del valor antiguo y la construcción del nuevo valor se realizan como si fuera mediante la siguiente función expositiva 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)...); // may throw
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)...); // may throw
}
catch (...)
{
std::construct_at(std::addressof(old_val), std::move(temp));
throw;
}
}
}
Parámetros
| other | - |
otro objeto expected cuyo valor contenido asignar
|
| v | - | valor a asignar al valor contenido |
| e | - | std::unexpected objeto cuyo valor contenido asignar |
| newval | - | el valor contenido a ser construido |
| oldval | - | el valor contenido a ser destruido |
| args | - | los argumentos usados como inicializadores de newval |
Valor de retorno
Excepciones
std::
is_nothrow_move_constructible_v
<
T
>
&&
std::
is_nothrow_move_assignable_v
<
T
>
&&
Ejemplo
|
Esta sección está incompleta
Razón: sin ejemplo |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3886 | C++23 |
el argumento de plantilla por defecto de la sobrecarga
(
3
)
era
T
|
cambiado a std:: remove_cv_t < T > |
| LWG 4025 | C++23 |
la sobrecarga
(
7
)
se definía como eliminada si
E
no es
move constructible o no es move assignable |
no participa en la
resolución de sobrecarga en este caso |
Véase también
|
construye el valor esperado in-situ
(función miembro pública) |