Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: ValueSwappable (seit C++11)

Von cppreference.com
 
 
C++ benannte Anforderungen
 

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

  1. T die LegacyIterator-Anforderungen erfüllt.
  2. Für jedes dereferenzierbare Objekt x vom Typ T (d.h. jeder Wert außer dem End-Iterator) erfüllt *x die 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

#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

spezifiziert, dass die Werte, auf die zwei indirectly_readable Typen verweisen, vertauscht werden können
(Konzept) [bearbeiten]