std::optional<T>:: swap
|
void
swap
(
optional
&
other
)
noexcept
(
/* voir ci-dessous */
)
;
|
(depuis C++17)
(constexpr depuis C++20) |
|
Échange le contenu avec celui de other .
- Si ni * this ni other ne contiennent de valeur, la fonction n'a aucun effet.
-
Si un seul des deux
*
this
et
other
contient une valeur (appelons cet objet
inet l'autreun), la valeur contenue deunest initialisée directement à partir de std :: move ( * in ) , suivie de la destruction de la valeur contenue deincomme par in - > T :: ~T ( ) . Après cet appel,inne contient plus de valeur ;uncontient une valeur.
- Si les deux * this et other contiennent des valeurs, les valeurs contenues sont échangées en appelant using std:: swap ; swap ( ** this, * other ) .
Le programme est mal formé à moins que le type
T
ne soit
Swappable
et que
std::
is_move_constructible_v
<
T
>
ne soit
true
.
Table des matières |
Paramètres
| autre | - |
l'objet
optional
avec lequel échanger le contenu
|
Valeur de retour
(aucun)
Exceptions
std:: is_nothrow_swappable_v < T > )
En cas d'exception levée, les états des valeurs contenues de
*
this
et
other
sont déterminés par les garanties de sûreté d'exception du
swap
du type
T
ou du constructeur de déplacement de
T
, selon celui qui est appelé. Pour
*
this
et
other
, si l'objet contenait une valeur, il reste contenant une valeur, et vice versa.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_optional
|
202106L
|
(C++20)
(DR20) |
Complètement constexpr |
Exemple
#include <iostream> #include <optional> #include <string> int main() { std::optional<std::string> opt1("First example text"); std::optional<std::string> opt2("2nd text"); enum Swap { Before, After }; auto print_opts = [&](Swap e) { std::cout << (e == Before ? "Before swap:\n" : "After swap:\n"); std::cout << "opt1 contains '" << opt1.value_or("") << "'\n"; std::cout << "opt2 contains '" << opt2.value_or("") << "'\n"; std::cout << (e == Before ? "---SWAP---\n": "\n"); }; print_opts(Before); opt1.swap(opt2); print_opts(After); // Swap with only 1 set opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt."; opt2.reset(); print_opts(Before); opt1.swap(opt2); print_opts(After); }
Sortie :
Before swap: opt1 contains 'First example text' opt2 contains '2nd text' ---SWAP--- After swap: opt1 contains '2nd text' opt2 contains 'First example text' Before swap: opt1 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.' opt2 contains '' ---SWAP--- After swap: opt1 contains '' opt2 contains 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
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 | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| P2231R1 | C++20 |
swap
n'était pas
constexpr
alors que les opérations requises pouvaient être
constexpr
en C++20
|
rendu constexpr |
Voir aussi
|
(C++17)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |