Namespaces
Variants

C++ named requirements: ValueSwappable (since C++11)

From cppreference.net
C++ named requirements

Deux objets de ce type peuvent être déréférencés et les valeurs résultantes peuvent être échangées en utilisant un appel de fonction non qualifié swap ( ) dans le contexte où à la fois std::swap et les swap ( ) définis par l'utilisateur sont visibles.

Exigences

Un type T est ValueSwappable si

  1. T satisfait les exigences LegacyIterator .
  2. Pour tout objet déréférençable x de type T (c'est-à-dire toute valeur autre que l'itérateur de fin), *x satisfait les exigences Swappable .

De nombreuses fonctions de la bibliothèque standard attendent que leurs arguments satisfassent ValueSwappable , ce qui signifie qu'à chaque fois que la bibliothèque standard effectue un swap, elle utilise l'équivalent de using std:: swap ; swap ( * iter1, * iter2 ) ; .

Exemple

#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
}

Voir aussi

spécifie que les valeurs référencées par deux indirectly_readable types peuvent être échangées
(concept)