Namespaces
Variants

std::variant<Types...>::swap

De fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support linguistique
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déprécié en C++20)
 
 
void swap( variant& rhs ) noexcept(/* see below */);
(depuis C++17)
(constexpr depuis C++20)

Échange deux objets variant.

  • Si *this et rhs sont tous deux sans valeur par exception, ne fait rien.
  • Sinon, si *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écurité vis-à-vis des exceptions de la fonction swap appelé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é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 .

noexcept spécification :
noexcept ( ( ( std:: is_nothrow_move_constructible_v < Types > &&
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

spécialise l'algorithme std::swap
(modèle de fonction)