Espacios de nombres
Variantes
Acciones

Requisitos denominados de C++: ValueSwappable (desde C++11)

De cppreference.com
< cpp‎ | named req
 
 
Requisitos denominados de C++
Números aleatorios
Concurrencia
(C++11)
(C++11)
Rangos
Vista multidimensional
Otros

 

Se pueden desreferenciar dos objetos de este tipo y los valores resultantes se pueden intercambiar usando una llamada de función no calificada a swap() en el contexto donde tanto std::swap como las funciones swap() definidas por usuario son visibles.

[editar] Requisitos

Un tipo T es ValueSwappable si

  1. T satisface los requisitos Iterator.
  2. Para cualquier objeto desreferenciable x de tipo T (es decir, cualquier valor que no sea el iterador final), *x satisface los requisitos Swappable.

Muchas funciones de la biblioteca estándar esperan que sus argumentos satisfagan ValueSwappable, lo que significa que cada vez que la biblioteca estándar realiza un intercambio, usa el equivalente a using std::swap; swap(*iter1, *iter2);.

[editar] Ejemplo

#include <iostream>
#include <vector>
 
class IntVector
{
    std::vector<int> v;
//  IntVector& operator=(IntVector); // no asignable (modo C++98)
public:
    IntVector& operator=(IntVector) = delete; // no asignable
    void swap(IntVector& otro)
    {
        v.swap(otro.v);
    }
};
 
void swap(IntVector& v1, IntVector& v2)
{
    v1.swap(v2);
}
 
int main()
{
    IntVector v1, v2;    // IntVector es Swappable, pero no MoveAssignable
    IntVector* p1 = &v1;
    IntVector* p2 = &v2; // IntVector* es ValueSwappable
    std::iter_swap(p1, p2); // Correcto: iter_swap requiere ValueSwappable
//  std::swap(v1, v2); // error de compilación! std::swap requiere MoveAssignable
}


[editar] Véase también

Especifica que dos valores referenciados por tipos indirectly_readable se pueden intercambiar.
(concepto) [editar]