Namespaces
Variants

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

From cppreference.net
Utilities library
void swap ( variant & rhs ) noexcept ( /* siehe unten */ ) ;
(seit C++17)
(constexpr seit C++20)

Tauscht zwei variant Objekte aus.

  • Wenn sowohl * this als auch rhs aufgrund einer Exception wertlos sind, erfolgt keine Aktion.
  • Andernfalls, wenn sowohl * this als auch rhs dieselbe Alternative enthalten, wird swap ( * std:: get_if < i > ( this ) , * std:: get_if < i > ( std:: addressof ( rhs ) ) ) aufgerufen, wobei i gleich index() ist. Falls eine Exception ausgelöst wird, hängt der Zustand der Werte von der Exception-Sicherheit der aufgerufenen swap -Funktion ab.
  • Andernfalls werden die Werte von rhs und * this ausgetauscht. Falls eine Exception ausgelöst wird, hängt der Zustand von * this und rhs von der Exception-Sicherheit des Move-Konstruktors des Variants ab.

Das Programm ist fehlerhaft, es sei denn, der Typ T_i ist Swappable und std:: is_move_constructible_v < T_i > ist true für alle T_i in Types... .

Inhaltsverzeichnis

Parameter

rhs - ein variant Objekt zum Austauschen

Rückgabewert

(keine)

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 gleich index() ist.

Andernfalls kann jede Ausnahme ausgelöst werden, die von den Move-Konstruktoren der aktuell in * this und rhs gehaltenen Alternativen ausgelöst wird.

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

Hinweise

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

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

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
P2231R1 C++20 swap war nicht constexpr während nicht-triviale Destruktoren in C++20 constexpr sein können wurde constexpr gemacht

Siehe auch

spezialisiert den std::swap Algorithmus
(Funktionsschablone)