Requisitos denominados de C++: ValueSwappable (desde C++11)
De cppreference.com
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.
Requisitos
Un tipo T es ValueSwappable si
Tsatisface los requisitos Iterator.- Para cualquier objeto desreferenciable
xde tipoT(es decir, cualquier valor que no sea el iterador final),*xsatisface 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);.
Ejemplo
Ejecuta este código
#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
}
Véase también
(C++20) |
Especifica que dos valores referenciados por tipos indirectly_readable se pueden intercambiar. (concepto) |