std::variant<Types...>:: swap
|
void
swap
(
variant
&
rhs
)
noexcept
(
/* voir ci-dessous */
)
;
|
(depuis C++17)
(constexpr depuis C++20) |
|
Échange deux
variant
objets.
- Si les deux * this et rhs sont sans valeur par exception, ne fait rien.
-
Sinon, si les deux
*
this
et
rhs
contiennent la même alternative, appelle
swap
(
*
std::
get_if
<
i
>
(
this
)
,
*
std::
get_if
<
i
>
(
std::
addressof
(
rhs
)
)
)
où
i
est
index(). Si une exception est levée, l'état des valeurs dépend de la sûreté face aux exceptions de la fonctionswapappelée. - Sinon, échange les valeurs de rhs et * this . Si une exception est levée, l'état de * this et rhs dépend de la sûreté face aux exceptions du constructeur par déplacement du variant.
Le programme est mal formé à moins que les types
T_i
ne soient
Swappable
et que
std::
is_move_constructible_v
<
T_i
>
soit
true
pour tous les
T_i
dans
Types...
.
Table des matières |
Paramètres
| rhs | - |
un objet
variant
à échanger
|
Valeur de retour
(aucun)
Exceptions
Si
this
-
>
index
(
)
==
rhs.
index
(
)
, peut lever toute exception levée par
swap
(
*
std::
get_if
<
i
>
(
this
)
,
*
std::
get_if
<
i
>
(
std::
addressof
(
rhs
)
)
)
avec
i
étant
index()
.
Sinon, peut lever toute exception levée par les constructeurs de déplacement des alternatives actuellement détenues par * this et rhs .
std:: is_nothrow_swappable_v < Types > ) && ... ) )
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_variant
|
202106L
|
(C++20)
(DR) |
std::variant
entièrement
constexpr
|
Exemple
#include <iostream> #include <string> #include <variant> int main() { std::variant<int, std::string> v1{2}, v2{"abc"}; std::visit([](auto&& x) { std::cout << x << ' '; }, v1); std::visit([](auto&& x) { std::cout << x << '\n'; }, v2); v1.swap(v2); std::visit([](auto&& x) { std::cout << x << ' '; }, v1); std::visit([](auto&& x) { std::cout << x << '\n'; }, v2); }
Sortie :
2 abc abc 2
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é |
|---|---|---|---|
| P2231R1 | C++20 |
swap
n'était pas
constexpr
alors que les destructeurs non triviaux peuvent être
constexpr
en C++20
|
rendu constexpr |
Voir aussi
|
(C++17)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |