std::variant<Types...>::swap
void swap( variant& rhs ) noexcept(/* see below */);
|
(seit C++17) (constexpr seit C++20) |
|
Tauscht zwei variant-Objekte.
- Wenn sowohl
*thisals auchrhsaufgrund einer Ausnahme wertlos sind, wird nichts getan. - Andernfalls, wenn sowohl
*thisals auchrhsdieselbe Alternative enthalten, wirdswap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs)))aufgerufen, wobeiiindex()ist. Wenn eine Ausnahme ausgelöst wird, hängt der Zustand der Werte von der Ausnahmesicherheit der aufgerufenenswap-Funktion ab. - Andernfalls werden die Werte von
rhsund*thisausgetauscht. Wenn eine Ausnahme ausgelöst wird, hängt der Zustand von*thisundrhsvon der Ausnahmesicherheit des Move-Konstruktors von variant 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....
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.
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
|
(C++17)
|
spezialisiert den
std::swap
Algorithmus
(Funktionsschablone) |