Namespaces
Variants

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

From cppreference.net
Utilities library
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 ) ) ) i est index() . Si une exception est levée, l'état des valeurs dépend de la sûreté face aux 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û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 .

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)