std::variant<Types...>::swap
void swap( variant& rhs ) noexcept(/* see below */);
|
(depuis C++17) (constexpr depuis C++20) |
|
Échange deux objets variant.
- Si
*thisetrhssont tous deux sans valeur par exception, ne fait rien. - Sinon, si
*thisetrhscontiennent la même alternative, appelleswap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs)))oùiestindex(). Si une exception est levée, l'état des valeurs dépend de la sécurité vis-à-vis des exceptions de la fonctionswapappelée. - Sinon, échange les valeurs de
rhset*this. Si une exception est levée, l'état de*thisetrhsdépend de la sécurité vis-à-vis des exceptions du constructeur de déplacement de variant.
Le programme est mal formé sauf si le type T_i est Échangeable et que std::is_move_constructible_v<T_i> est true pour tout T_i dans Types....
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) |