C++ benannte Anforderungen: ValueSwappable (seit C++11)
Von cppreference.com
< cpp | benannte req
Zwei Objekte dieses Typs können dereferenziert werden und die resultierenden Werte können mittels eines unqualifizierten Funktionsaufrufs swap() im Kontext, in dem sowohl std::swap als auch benutzerspezifische swap()s sichtbar sind, vertauscht werden.
[bearbeiten] Anforderungen
Ein Typ T ist ValueSwappable, wenn
-
Tdie LegacyIterator-Anforderungen erfüllt. - Für jedes dereferenzierbare Objekt
xvom TypT(d.h. jeder Wert außer dem End-Iterator) erfüllt*xdie Swappable-Anforderungen.
Viele Funktionen der Standardbibliothek erwarten, dass ihre Argumente ValueSwappable erfüllen, was bedeutet, dass die Standardbibliothek immer dann, wenn sie einen Tausch vornimmt, das Äquivalent von using std::swap; swap(*iter1, *iter2); verwendet.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <iostream> #include <vector> class IntVector { std::vector<int> v; // IntVector& operator=(IntVector); // not assignable (C++98 way) public: IntVector& operator=(IntVector) = delete; // not assignable void swap(IntVector& other) { v.swap(other.v); } }; void swap(IntVector& v1, IntVector& v2) { v1.swap(v2); } int main() { IntVector v1, v2; // IntVector is Swappable, but not MoveAssignable IntVector* p1 = &v1; IntVector* p2 = &v2; // IntVector* is ValueSwappable std::iter_swap(p1, p2); // OK: iter_swap requires ValueSwappable // std::swap(v1, v2); // compiler error! std::swap requires MoveAssignable }
[bearbeiten] Siehe auch
| (C++20) |
spezifiziert, dass die Werte, auf die zwei indirectly_readable Typen verweisen, vertauscht werden können(Konzept) |