std::swap
| Definiert in Header <algorithm> |
(bis C++11) |
|
| Definiert in der Header-Datei <utility> |
(seit C++11) |
|
| Definiert in Header <string_view> |
||
| template< class T > void swap( T& a, T& b ); |
(1) | (bedingt noexcept seit C++11) (constexpr seit C++20) |
| template< class T2, std::size_t N > void swap( T2 (&a)[N], T2 (&b)[N] ); |
(2) | (bedingt noexcept seit C++11) (constexpr seit C++20) |
Tauscht die gegebenen Werte.
|
Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn std::is_move_constructible_v<T> && std::is_move_assignable_v<T> true ist. |
(seit C++17) |
|
Diese Überladung nimmt nur an der Auflösung von Überladungen teil, wenn std::is_swappable_v<T2> true ist. |
(seit C++17) |
Inhalt |
[edit] Parameter
| a, b | - | die zu tauschenden Werte |
| Typanforderungen | ||
-T muss die Anforderungen von CopyConstructible und CopyAssignable(bis C++11)MoveConstructible und MoveAssignable(seit C++11) erfüllen. | ||
-T2 muss die Anforderungen von Swappable erfüllen. | ||
[edit] Rückgabewert
(keine)
[edit] Ausnahmen
|
(keine) |
(bis C++11) |
|
noexcept-Spezifikation:
noexcept( std::is_nothrow_move_constructible<T>::value && |
(seit C++11) |
|
noexcept-Spezifikation: Die Suche nach dem Bezeichner noexcept(noexcept(swap(*a, *b))) swap in der Ausnahme-Spezifikation findet diese Funktionsvorlage zusätzlich zu allem, was durch die üblichen Suchregeln gefunden wird, wodurch die Ausnahme-Spezifikation äquivalent zu C++17 std::is_nothrow_swappable wird. |
(seit C++11) (bis C++17) |
|
noexcept-Spezifikation:
noexcept(std::is_nothrow_swappable_v<T2>) |
(seit C++17) |
[edit] Komplexität
[edit] Spezialisierungen
|
|
(bis C++20) |
Der erwartete Weg, einen von Programmen definierten Typ tauschbar zu machen, ist die Bereitstellung einer nicht-Member-Funktion swap im selben Namespace wie der Typ: siehe Swappable für Details.
Die folgenden Überladungen werden bereits von der Standardbibliothek bereitgestellt
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktionsvorlage) |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktionsschablone) |
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktionsschablone) |
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktionsschablone) |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (function template) | |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (function template) | |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| spezialisiert den std::swap Algorithmus (function template) | |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (function template) | |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsschablone) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| spezialisiert den std::swap Algorithmus (Funktionsvorlage) | |
| (C++11) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (Funktionstemplate) | |
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktion) |
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktionsvorlage) |
| (C++14) |
spezialisiert den std::swap Algorithmus (function template) |
| (C++11) |
spezialisiert den std::swap Algorithmus (Funktionstemplates) |
| spezialisiert den std::swap Algorithmus (Funktionstemplates) | |
| (C++17) |
spezialisiert den std::swap Algorithmus (function template) |
| (C++17) |
spezialisiert den std::swap Algorithmus (function) |
| (C++17) |
spezialisiert den std::swap Algorithmus (function template) |
| spezialisiert den std::swap Algorithmus (function template) | |
| (C++17) |
spezialisiert den std::swap Algorithmus (Funktion) |
| (C++23) |
spezialisiert den std::swap Algorithmus (Funktion) |
| (C++20) |
spezialisiert den std::swap Algorithmus (Funktion) |
| spezialisiert den std::swap Algorithmus (Funktion) | |
| (C++20) |
spezialisiert den std::swap Algorithmus (Funktion) |
| (C++20) |
spezialisiert den std::swap Algorithmus (Funktion) |
[edit] Beispiel
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // error, type requirements are not satisfied swap(p, q); // OK, ADL finds the appropriate friend `swap` std::cout << p << ' ' << q << '\n'; }
Ausgabe
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
[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 |
|---|---|---|---|
| LWG 227 | C++98 | T musste nicht CopyConstructible oder DefaultConstructible sein(ein temporäres Objekt vom Typ T konnte möglicherweise nicht konstruiert werden) |
T muss auchCopyConstructible sein |
| LWG 809 | C++98 | Arrays konnten nicht getauscht werden | Überladung (2) hinzugefügt |
| LWG 2554 | C++11 | mehrdimensionale Arrays zu tauschen kann niemals sein noexcept aufgrund von Namensauflösungsproblemen |
wurde behoben |
[edit] Siehe auch
| (C++20) |
tauscht die Werte von zwei Objekten (Customization Point Objekt) |
| Tauscht die Elemente, auf die zwei Iteratoren zeigen (Funktionstempelat) | |
| Tauscht zwei Elementbereiche (Funktionstempelat) | |
| (C++14) |
ersetzt das Argument durch einen neuen Wert und gibt seinen vorherigen Wert zurück (Funktionsvorlage) |