Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | utility‎ | variant
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
void swap( variant& rhs ) noexcept(/* siehe unten */);
(seit C++17)
(constexpr seit C++20)

Tauscht zwei variant-Objekte.

  • Wenn sowohl *this als auch rhs wertlos sind (valueless by exception), tut die Funktion nichts.
  • Andernfalls, wenn sowohl *this als auch rhs die gleiche Alternative speichern, wird swap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs))) aufgerufen, wobei i index() ist. Wenn eine Ausnahme ausgelöst wird, hängt der Zustand der Werte von der Ausnahme-Sicherheit der aufgerufenen swap-Funktion ab.
  • Andernfalls werden die Werte von rhs und *this ausgetauscht. Wenn eine Ausnahme ausgelöst wird, hängt der Zustand von *this und rhs von der Ausnahme-Sicherheit des Move-Konstruktors des Variants ab.

Das Programm ist ill-formed, es sei denn, die Typen T_i sind Swappable und std::is_move_constructible_v<T_i> ist true für alle T_i in Types....

Inhalt

[edit] Parameter

rhs - Ein variant-Objekt, mit dem getauscht werden soll

[edit] Rückgabewert

(keine)

[edit] Ausnahmen

Wenn this->index() == rhs.index(), kann jede Ausnahme ausgelöst werden, die von swap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs))) ausgelöst wird, wobei i index() ist.

Andernfalls können Ausnahmen von den Move-Konstruktoren der aktuell von *this und rhs gehaltenen Alternativen ausgelöst werden.

noexcept-Spezifikation:  
noexcept(((std::is_nothrow_move_constructible_v<Types> &&
           std::is_nothrow_swappable_v<Types>) && ...))

[edit] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_variant 202106L (C++20)
(DR)
Vollständig constexpr std::variant

[edit] Beispiel

#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);
}

Ausgabe

2 abc
abc 2

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
P2231R1 C++20 swap war nicht constexpr, während nicht-triviale Destruktoren in C++20 constexpr sein können zu constexpr gemacht

[edit] Siehe auch

spezialisiert den Algorithmus std::swap
(function template) [bearbeiten]