std::variant<Types...>::swap
Von cppreference.com
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 aufgerufenenswap-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>) && ...))
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
Führen Sie diesen Code aus
#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
| (C++17) |
spezialisiert den Algorithmus std::swap (function template) |