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 ( /* voir ci-dessous */ ) ; |
(3) | (depuis C++17) |
|
template
<
class
U
>
optional & operator = ( const optional < U > & other ) ; |
(4) |
(depuis C++17)
(constexpr depuis C++20) |
|
template
<
class
U
>
optional & operator = ( optional < U > && other ) ; |
(5) |
(depuis C++17)
(constexpr depuis C++20) |
|
template
<
class
U
=
std::
remove_cv_t
<
T
>
>
optional & operator = ( U && value ) ; |
(6) |
(depuis C++17)
(constexpr depuis C++20) |
Remplace le contenu de * this par le contenu de other .
val
-
>
T
::
~T
(
)
pour détruire la valeur contenue ; sinon, aucun effet.
*
this
ne contient pas de valeur après cet appel.
| Effet | * this contient une valeur | * this ne contient pas de valeur |
|---|---|---|
| other contient une valeur |
|
|
| other ne contient pas de valeur |
détruit la valeur contenue en appelant
val
-
>
T
::
~T
(
)
|
aucun effet |
-
Les 12 valeurs suivantes sont toutes
false
[1]
:
- 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 (4) , std:: is_constructible_v < T, const U & > et std:: is_assignable_v < T & , const U & > sont tous deux true .
- Pour la surcharge (5) , std:: is_constructible_v < T, U > et std:: is_assignable_v < T & , U > sont tous deux true .
- std:: decay_t < U > (jusqu'en C++20) std:: remove_cvref_t < U > (depuis C++20) n'est pas std:: optional < T > .
- std:: is_constructible_v < T, U > est true .
- std:: is_assignable_v < T & , U > est true .
-
Au moins une des conditions suivantes est satisfaite :
-
Tn'est pas un type scalaire . -
std::
decay_t
<
U
>
n'est pas
T.
-
-
↑
En d'autres termes,
Tn'est pas constructible, convertible ou assignable à partir de toute expression de type (éventuellement qualifié const) std:: optional < U >
Table des matières |
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) |