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.
[editar] Requisitos
Un tipo T es ValueSwappable si
-
T
satisface los requisitos Iterator. - Para cualquier objeto desreferenciable
x
de tipoT
(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
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 }
[editar] Véase también
(C++20) |
Especifica que dos valores referenciados por tipos indirectly_readable se pueden intercambiar. (concepto) |