std::optional<T>::operator=
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.
*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.other.
- Si
*thisetotherne contiennent ni l'un ni l'autre une valeur, la fonction n'a aucun effet. - Si
*thiscontient une valeur, mais pasother, alors la valeur contenue est détruite en appelant son destructeur.*thisne contient pas de valeur après l'appel. - Si
othercontient une valeur, alors selon que*thiscontient une valeur ou non, la valeur contenue est soit directement initialisée soit assignée à partir de*other(2) ou destd::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>oustd::is_copy_assignable_v<T>estfalse. Elle est triviale sistd::is_trivially_copy_constructible_v<T>,std::is_trivially_copy_assignable_v<T>etstd::is_trivially_destructible_v<T>sont toustrue. - La surcharge (3) ne participe pas à la résolution de surcharge lorsque
std::is_move_constructible_v<T>oustd::is_move_assignable_v<T>estfalse. Elle est triviale sistd::is_trivially_move_constructible_v<T>,std::is_trivially_move_assignable_v<T>etstd::is_trivially_destructible_v<T>sont toustrue.
*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 :
Tn'est pas un type scalaire ;std::decay_t<U>n'est pasT.
other.
- Si
*thisetotherne contiennent ni l'un ni l'autre une valeur, la fonction n'a aucun effet. - Si
*thiscontient une valeur, mais pasother, alors la valeur contenue est détruite en appelant son destructeur.*thisne contient pas de valeur après l'appel. - Si
othercontient une valeur, alors selon que*thiscontient une valeur ou non, la valeur contenue est soit directement initialisée soit assignée à partir de*other(5) ou destd::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 :
Tn'est pas constructible, convertible ou assignable à partir d'une expression de type (éventuellementconst)std::optional<U>, c'est-à-dire que les 12 traits de type suivants sont tousfalse: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&>etstd::is_assignable_v<T&, const U&>sont tous deuxtrue. - Pour la surcharge (6),
std::is_constructible_v<T, U>etstd::is_assignable_v<T&, U>sont tous deuxtrue.
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
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.).
std:: is_nothrow_move_constructible_v < T > )
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) |