Namespaces
Variants

std::expected<T,E>:: operator=

From cppreference.net
Utilities library
Plantilla principal
constexpr expected & operator = ( const expected & other ) ;
(1) (desde C++23)
constexpr expected & operator = ( expected && other )
noexcept ( /* ver más abajo */ ) ;
(2) (desde C++23)
template < class U = std:: remove_cv_t < T > >
constexpr expected & operator = ( U && v ) ;
(3) (desde C++23)
template < class G >
constexpr expected & operator = ( const std:: unexpected < G > & e ) ;
(4) (desde C++23)
template < class G >
constexpr expected & operator = ( std:: unexpected < G > && e ) ;
(5) (desde C++23)
void especialización parcial
constexpr expected & operator = ( const expected & other ) ;
(6) (desde C++23)
constexpr expected & operator = ( expected && other )
noexcept ( /* ver más abajo */ ) ;
(7) (desde C++23)
template < class G >
constexpr expected & operator = ( const std:: unexpected < G > & e ) ;
(8) (desde C++23)
template < class G >
constexpr expected & operator = ( std:: unexpected < G > && e ) ;
(9) (desde C++23)
Plantilla de función auxiliar
template < class T, class U, class ... Args >
constexpr void /*reinit-expected*/ ( T & newval, U & oldval, Args && ... args )
(10) (desde C++23)
( solo para exposición* )

Asigna un nuevo valor a un objeto expected existente.

Contenidos

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

Efectos

Operadores de asignación de plantilla primaria

1,2) Asigna el estado de other a * this .
Si has_value() y rhs. has_value ( ) tienen valores diferentes (es decir, uno de * this y other contiene un valor esperado val y el otro contiene un valor inesperado unex ), se llama a la plantilla de función solo-exposición reinit-expected para actualizar el estado de forma segura.
1) El valor contenido se asigna de la siguiente manera:
Valor de
has_value()
Valor de other. has_value ( )
true false
true val = * other ; reinit-expected
( unex , val , other. error ( ) ) ;
false reinit-expected
( val , unex , * other ) ;
unex = other. error ( ) ;
2) El valor contenido se asigna de la siguiente manera:
Valor de
has_value()
Valor de other. has_value ( )
true false
true val = std :: move ( * other ) ; reinit-expected
( unex , val , std :: move ( other. error ( ) ) ) ;
false reinit-expected
( val , unex ,
std :: move ( * other ) ) ;
unex = std :: move ( other. error ( ) ) ;
Luego, si no se lanzó ninguna excepción, ejecuta has_val = other. has_value ( ) ; .
3) El valor esperado se asigna de la siguiente manera:
Valor de
has_value()
Equivalente a
true val = std:: forward < U > ( v ) ;
false reinit-expected ( val , unex , std:: forward < U > ( v ) ) ;
has_val = false ;
4,5) El valor inesperado se asigna de la siguiente manera:
Sobrecarga Valor de
has_value()
Equivalente a
( 4 ) true reinit-expected ( val , unex , std:: forward < const G & > ( e. error ( ) ) ) ;
has_val = false ;
false unex = std:: forward < const G & > ( e. error ( ) ) ;
( 5 ) true reinit-expected ( val , unex , std:: forward < G > ( e. error ( ) ) ) ;
has_val = false ;
false unex = std:: forward < G > ( e. error ( ) ) ;

void operadores de asignación de especialización parcial

6) El valor inesperado se asigna o destruye de la siguiente manera:
Valor de
has_value()
Valor de other. has_value ( )
true false
true (sin efectos) std:: construct_at
( std:: addressof ( unex ) , rhs. unex ) ;
has_val = false ;
false std:: destroy_at ( std:: addressof ( unex ) ) ;
has_val = true ;
unex = other. error ( ) ;
7) El valor inesperado se asigna o destruye de la siguiente manera:
Valor de
has_value()
Valor de other. has_value ( )
true false
true (sin efectos) std:: construct_at
( std:: addressof ( unex ) ,
std :: move ( rhs. unex ) ) ;
has_val = false ;
false std:: destroy_at ( std:: addressof ( unex ) ) ;
has_val = true ;
unex = std :: move ( other. error ( ) ) ;
8,9) El valor inesperado se asigna de la siguiente manera:
Sobrecarga Valor de
has_value()
Equivalente a
( 8 ) true std:: construct_at ( std:: addressof ( unex ) ,
std:: forward < const G & > ( e. error ( ) ) ) ;
has_val = false ;
false unex = std:: forward < const G & > ( e. error ( ) ) ;
( 9 ) true std:: construct_at ( std:: addressof ( unex ) , std:: forward < G > ( e. error ( ) ) ) ;
has_val = false ;
false unex = std:: forward < G > ( e. error ( ) ) ;

Plantilla de función auxiliar

La plantilla de función solo para exposición reinit-expected se "define" de la siguiente manera:

template<class NewType, class OldType, class... Args>
constexpr void reinit-expected(NewType& new_val, OldType& old_val, Args&&... args)
{
    // Caso 1: la construcción de "new_val" no lanza excepciones:
    // "new_val" puede construirse directamente después de destruir "old_val"
    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)...);
    }
    // Caso 2: la construcción por movimiento de "new_val" no lanza excepciones:
    // construir primero un objeto temporal NewType
    // ("old_val" permanece intacto si se lanza una excepción durante esta construcción)
    else if constexpr (std::is_nothrow_move_constructible_v<NewType>)
    {
        NewType temp(std::forward<Args>(args)...); // puede lanzar excepción
        std::destroy_at(std::addressof(old_val));
        std::construct_at(std::addressof(new_val), std::move(temp));
    }
    // Caso 3: la construcción de "new_val" puede lanzar excepciones:
    // se requiere una copia de seguridad de "old_val" para recuperarse de una excepción
    else
    {
        OldType temp(std::move(old_val)); // puede lanzar excepción
        std::destroy_at(std::addressof(old_val));
        try
        {
            std::construct_at(std::addressof(new_val),
                              std::forward<Args>(args)...); // puede lanzar excepción
        }
        catch (...)
        {
            std::construct_at(std::addressof(old_val), std::move(temp));
            throw;
        }
    }
}

Esta plantilla de función se llama cuando la asignación va a hacer que * this contenga el valor alternativo (es decir, de valor esperado a valor inesperado, o de valor inesperado a valor esperado).

En este caso, el valor antiguo oldval necesita ser destruido antes de construir el nuevo valor newval . Sin embargo, la construcción de newval puede lanzar una excepción. Para proporcionar garantía de seguridad de excepciones fuerte , el valor antiguo necesita ser restaurado antes de relanzar la excepción para que * this mantenga un estado válido mientras se maneja la excepción.

Valor de retorno

1-9) * this

Restricciones e información complementaria

Operadores de asignación de plantilla principal

1) Esta sobrecarga se define como eliminada a menos que todos los siguientes valores sean true :
2) Esta sobrecarga participa en la resolución de sobrecarga solo si todos los siguientes valores son true :
3) Esta sobrecarga participa en la resolución de sobrecarga solo si se cumplen todas las siguientes condiciones:
4) Esta sobrecarga participa en la resolución de sobrecarga solo si todos los siguientes valores son true :
5) Esta sobrecarga participa en la resolución de sobrecarga solo si todos los siguientes valores son true :

void operadores de asignación de especialización parcial

6) Esta sobrecarga se define como eliminada a menos que std:: is_copy_assignable_v < E > y std:: is_copy_constructible_v < E > sean ambos true .
7) Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_move_constructible_v < E > y std:: is_move_assignable_v < E > son ambos true .
8) Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_constructible_v < E, const G & > y std:: is_assignable_v < E & , const G & > son ambos true .
9) Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_constructible_v < E, G > y std:: is_assignable_v < E & , G > son ambos true .

Excepciones

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)