Namespaces
Variants

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

From cppreference.net
Utilities library
Modèle primaire
constexpr expected & operator = ( const expected & other ) ;
(1) (depuis C++23)
constexpr expected & operator = ( expected && other )
noexcept ( /* voir ci-dessous */ ) ;
(2) (depuis C++23)
template < class U = std:: remove_cv_t < T > >
constexpr expected & operator = ( U && v ) ;
(3) (depuis C++23)
template < class G >
constexpr expected & operator = ( const std:: unexpected < G > & e ) ;
(4) (depuis C++23)
template < class G >
constexpr expected & operator = ( std:: unexpected < G > && e ) ;
(5) (depuis C++23)
void spécialisation partielle
constexpr expected & operator = ( const expected & other ) ;
(6) (depuis C++23)
constexpr expected & operator = ( expected && other )
noexcept ( /* voir ci-dessous */ ) ;
(7) (depuis C++23)
template < class G >
constexpr expected & operator = ( const std:: unexpected < G > & e ) ;
(8) (depuis C++23)
template < class G >
constexpr expected & operator = ( std:: unexpected < G > && e ) ;
(9) (depuis C++23)
Modèle de fonction d'assistance
template < class T, class U, class ... Args >
constexpr void /*reinit-expected*/ ( T & newval, U & oldval, Args && ... args )
(10) (depuis C++23)
( exposition uniquement* )

Attribue une nouvelle valeur à un objet expected existant.

Table des matières

Paramètres

other - autre objet expected dont la valeur contenue doit être assignée
v - valeur à assigner à la valeur contenue
e - std::unexpected objet dont la valeur contenue doit être assignée
newval - la valeur contenue à construire
oldval - la valeur contenue à détruire
args - les arguments utilisés comme initialiseurs de newval

Effets

Opérateurs d'affectation du modèle principal

1,2) Attribue l'état de other à * this .
Si has_value() et rhs. has_value ( ) ont des valeurs différentes (c'est-à-dire que l'un de * this et other contient une valeur attendue val et l'autre contient une valeur inattendue unex ), le modèle de fonction exposition-only reinit-expected est appelé pour mettre à jour l'état de manière sécurisée.
1) La valeur contenue est assignée comme suit :
Valeur de
has_value()
Valeur 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) La valeur contenue est assignée comme suit :
Valeur de
has_value()
Valeur 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 ( ) ) ;
Ensuite, si aucune exception n'a été levée, exécute has_val = other. has_value ( ) ; .
3) La valeur attendue est assignée comme suit :
Valeur de
has_value()
Équivalent à
true val = std:: forward < U > ( v ) ;
false reinit-expected ( val , unex , std:: forward < U > ( v ) ) ;
has_val = false ;
4,5) La valeur inattendue est assignée comme suit :
Surcharge Valeur de
has_value()
Équivalent à
( 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 opérateurs d'affectation de spécialisation partielle

6) La valeur inattendue est assignée ou détruite comme suit :
Valeur de
has_value()
Valeur de other. has_value ( )
true false
true (aucun effet) 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) La valeur inattendue est assignée ou détruite comme suit :
Valeur de
has_value()
Valeur de other. has_value ( )
true false
true (aucun effet) 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) La valeur inattendue est assignée comme suit :
Surcharge Valeur de
has_value()
Équivalent à
( 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 ( ) ) ;

Modèle de fonction d'assistance

Le modèle de fonction d'exposition uniquement reinit-expected est « défini » comme suit :

template<class NewType, class OldType, class... Args>
constexpr void reinit-expected(NewType& new_val, OldType& old_val, Args&&... args)
{
    // Cas 1 : la construction de « new_val » est non-lançante :
    // « new_val » peut être construit directement après la destruction de « 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)...);
    }
    // Cas 2 : la construction par déplacement de « new_val » est non-lançante :
    // construire d'abord un objet temporaire NewType
    // (« old_val » reste intact si une exception est lancée lors de cette construction)
    else if constexpr (std::is_nothrow_move_constructible_v<NewType>)
    {
        NewType temp(std::forward<Args>(args)...); // peut lancer
        std::destroy_at(std::addressof(old_val));
        std::construct_at(std::addressof(new_val), std::move(temp));
    }
    // Cas 3 : la construction de « new_val » est potentiellement lançante :
    // une sauvegarde de « old_val » est nécessaire pour récupérer après une exception
    else
    {
        OldType temp(std::move(old_val)); // peut lancer
        std::destroy_at(std::addressof(old_val));
        try
        {
            std::construct_at(std::addressof(new_val),
                              std::forward<Args>(args)...); // peut lancer
        }
        catch (...)
        {
            std::construct_at(std::addressof(old_val), std::move(temp));
            throw;
        }
    }
}

Ce modèle de fonction est appelé lorsque l'affectation va faire en sorte que * this contienne la valeur alternative (c'est-à-dire d'une valeur attendue à une valeur inattendue, ou d'une valeur inattendue à une valeur attendue).

Dans ce cas, l'ancienne valeur oldval doit être détruite avant de construire la nouvelle valeur newval . Cependant, la construction de newval peut lever une exception. Afin de fournir la garantie de sécurité d'exception forte , l'ancienne valeur doit être restaurée avant de relancer l'exception afin que * this ait un état valide pendant le traitement de l'exception.

Valeur de retour

1-9) * this

Contraintes et informations supplémentaires

Opérateurs d'affectation du modèle principal

1) Cette surcharge est définie comme supprimée sauf si toutes les valeurs suivantes sont true :
2) Cette surcharge participe à la résolution de surcharge seulement si toutes les valeurs suivantes sont true :
3) Cette surcharge participe à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :
4) Cette surcharge participe à la résolution de surcharge seulement si toutes les valeurs suivantes sont true :
5) Cette surcharge participe à la résolution de surcharge seulement si toutes les valeurs suivantes sont true :

void opérateurs d'affectation de spécialisation partielle

6) Cette surcharge est définie comme supprimée sauf si std:: is_copy_assignable_v < E > et std:: is_copy_constructible_v < E > sont tous deux true .
7) Cette surcharge participe à la résolution de surcharge seulement si std:: is_move_constructible_v < E > et std:: is_move_assignable_v < E > sont tous deux true .
8) Cette surcharge participe à la résolution de surcharge seulement si std:: is_constructible_v < E, const G & > et std:: is_assignable_v < E & , const G & > sont tous deux true .
9) Cette surcharge participe à la résolution de surcharge seulement si std:: is_constructible_v < E, G > et std:: is_assignable_v < E & , G > sont tous deux true .

Exceptions

Exemple

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 3886 C++23 l'argument template par défaut de la surcharge ( 3 ) était T modifié en std:: remove_cv_t < T >
LWG 4025 C++23 la surcharge ( 7 ) était définie comme supprimée si E n'est
pas constructible par déplacement ou pas assignable par déplacement
elle ne participe pas à la
résolution de surcharge dans ce cas

Voir aussi

construit la valeur attendue en place
(fonction membre publique)