Namespaces
Variants

std::optional<T>::operator=

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
 
optional& operator=( std::nullopt_t ) noexcept;
(1) (depuis C++17)
(constexpr depuis C++20)
constexpr optional& operator=( const optional& other );
(2) (depuis C++17)
constexpr optional& operator=( optional&& other ) noexcept(/* see below */);
(3) (depuis C++17)
template< class U = std::remove_cv_t<T> >
optional& operator=( U&& value );
(4) (depuis C++17)
(constexpr depuis C++20)
template< class U >
optional& operator=( const optional<U>& other );
(5) (depuis C++17)
(constexpr depuis C++20)
template< class U >
optional& operator=( optional<U>&& other );
(6) (depuis C++17)
(constexpr depuis C++20)

Remplace le contenu de *this par le contenu de other.

1) Si *this contient une valeur avant l'appel, la valeur contenue est détruite en appelant son destructeur comme par value().T::~T(). *this ne contient pas de valeur après cet appel.
2,3) Assigne l'état de other.
  • Si *this et other ne contiennent ni l'un ni l'autre une valeur, la fonction n'a aucun effet.
  • Si *this contient une valeur, mais pas other, alors la valeur contenue est détruite en appelant son destructeur. *this ne contient pas de valeur après l'appel.
  • Si other contient une valeur, alors selon que *this contient une valeur ou non, la valeur contenue est soit directement initialisée soit assignée à partir de *other (2) ou de std::move(*other) (3). Notez qu'un optional déplacé contient toujours une valeur.
  • La surcharge (2) est supprimée lorsque std::is_copy_constructible_v<T> ou std::is_copy_assignable_v<T> est false. Elle est triviale si std::is_trivially_copy_constructible_v<T>, std::is_trivially_copy_assignable_v<T> et std::is_trivially_destructible_v<T> sont tous true.
  • La surcharge (3) ne participe pas à la résolution de surcharge lorsque std::is_move_constructible_v<T> ou std::is_move_assignable_v<T> est false. Elle est triviale si std::is_trivially_move_constructible_v<T>, std::is_trivially_move_assignable_v<T> et std::is_trivially_destructible_v<T> sont tous true.
4) Assignation par transfert parfait : selon si *this contient une valeur avant l'appel, la valeur contenue est soit directement initialisée à partir de std::forward<U>(value) soit assignée à partir de std::forward<U>(value). La fonction ne participe pas à la résolution de surcharge à moins que std::decay_t<U>(jusqu'à C++20)std::remove_cvref_t<U>(depuis C++20) ne soit pas std::optional<T>, que std::is_constructible_v<T, U> soit true, que std::is_assignable_v<T&, U> soit true, et qu'au moins une des conditions suivantes soit vraie :
5,6) Assigne l'état de other.
  • Si *this et other ne contiennent ni l'un ni l'autre une valeur, la fonction n'a aucun effet.
  • Si *this contient une valeur, mais pas other, alors la valeur contenue est détruite en appelant son destructeur. *this ne contient pas de valeur après l'appel.
  • Si other contient une valeur, alors selon que *this contient une valeur ou non, la valeur contenue est soit directement initialisée soit assignée à partir de *other (5) ou de std::move(*other) (6). Notez qu'un optional déplacé contient toujours une valeur.
  • Ces surcharges ne participent pas à la résolution de surcharge à moins que les conditions suivantes soient remplies :
    • T n'est pas constructible, convertible ou assignable à partir d'une expression de type (éventuellement const) std::optional<U>, c'est-à-dire que les 12 traits de type suivants sont tous false :
      • std::is_constructible_v<T, std::optional<U>&>
      • std::is_constructible_v<T, const std::optional<U>&>
      • std::is_constructible_v<T, std::optional<U>&&>
      • std::is_constructible_v<T, const std::optional<U>&&>
      • std::is_convertible_v<std::optional<U>&, T>
      • std::is_convertible_v<const std::optional<U>&, T>
      • std::is_convertible_v<std::optional<U>&&, T>
      • std::is_convertible_v<const std::optional<U>&&, T>
      • std::is_assignable_v<T&, std::optional<U>&>
      • std::is_assignable_v<T&, const std::optional<U>&>
      • std::is_assignable_v<T&, std::optional<U>&&>
      • std::is_assignable_v<T&, const std::optional<U>&&>
    • Pour la surcharge (5), std::is_constructible_v<T, const U&> et std::is_assignable_v<T&, const U&> sont tous deux true.
    • Pour la surcharge (6), std::is_constructible_v<T, U> et std::is_assignable_v<T&, U> sont tous deux true.

Paramètres

other - autre objet optional dont la valeur contenue doit être assignée
value - valeur à assigner à la valeur contenue

Valeur de retour

* this

Exceptions

2-6) Lance toute exception levée par le constructeur ou l'opérateur d'affectation de T . Si une exception est levée, l'état d'initialisation de * this (et de other dans le cas de ( 2-5 ) ) reste inchangé, c'est-à-dire que si l'objet contenait une valeur, il contient toujours une valeur, et vice versa. Le contenu de value et les valeurs contenues de * this et other dépendent des garanties de sécurité face aux exceptions de l'opération à l'origine de l'exception (constructeur de copie, affectation de déplacement, etc.).
3) Possède la spécification

Notes

Un objet optionnel op peut être transformé en un optionnel vide avec à la fois op = { } ; et op = nullopt ; . La première expression construit un objet optional vide avec { } et l'assigne à op .

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_optional 202106L (C++20)
(DR20)
Entièrement constexpr ( 1 ) , ( 4-6 )

Exemple

#include <iostream>
#include <optional>
int main()
{
    std::optional<const char*> s1 = "abc", s2; // constructeur
    s2 = s1; // assignation
    s1 = "def"; // assignation avec décroissance (U = char[4], T = const char*)
    std::cout << *s2 << ' ' << *s1 << '\n';
}

Sortie :

abc def

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 Appliqué à Comportement publié Comportement corrigé
LWG 3886 C++17 l'argument template par défaut de la surcharge ( 6 ) était T modifié en std:: remove_cv_t < T >
P0602R4 C++17 l'opérateur d'affectation par copie/déplacement peut ne pas être trivial
même si les opérations sous-jacentes sont triviales
requis pour propager la trivialité
P2231R1 C++20 les surcharges ( 1,4-6 ) n'étaient pas constexpr rendues constexpr

Voir aussi

construit la valeur contenue en place
(fonction membre publique)