std:: swap
|
Definido en el encabezado
<algorithm>
|
(hasta C++11)
|
|
|
Definido en el encabezado
<utility>
|
(desde C++11)
|
|
|
Definido en el encabezado
<string_view>
|
||
|
template
<
class
T
>
void swap ( T & a, T & b ) ; |
(1) |
(condicionalmente noexcept desde C++11)
(constexpr desde C++20) |
|
template
<
class
T2,
std::
size_t
N
>
void swap ( T2 ( & a ) [ N ] , T2 ( & b ) [ N ] ) ; |
(2) |
(condicionalmente noexcept desde C++11)
(constexpr desde C++20) |
Intercambia los valores dados.
|
Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_move_constructible_v < T > && std:: is_move_assignable_v < T > es true . |
(desde C++17) |
|
Esta sobrecarga participa en la resolución de sobrecarga solo si std:: is_swappable_v < T2 > es true . |
(desde C++17) |
Contenidos |
Parámetros
| a, b | - | los valores a intercambiar |
| Requisitos de tipo | ||
-
T
debe cumplir con los requisitos de
CopyConstructible
y
CopyAssignable
(hasta C++11)
MoveConstructible
y
MoveAssignable
(desde C++11)
.
|
||
-
T2
debe cumplir con los requisitos de
Swappable
.
|
||
Valor de retorno
(ninguno)
Excepciones
|
(ninguno) |
(hasta C++11) |
|
noexcept
especificación:
noexcept
(
std::
is_nothrow_move_constructible
<
T
>
::
value
&&
|
(desde C++11) |
|
noexcept
especificación:
La búsqueda del identificador
noexcept
(
noexcept
(
swap
(
*
a,
*
b
)
)
)
swap
en la especificación de excepciones encuentra esta plantilla de función además de cualquier resultado encontrado por las reglas habituales de búsqueda, haciendo que la especificación de excepciones sea equivalente a C++17
std::is_nothrow_swappable
.
|
(desde C++11)
(hasta C++17) |
|
noexcept
especificación:
noexcept
(
std::
is_nothrow_swappable_v
<
T2
>
)
|
(desde C++17) |
Complejidad
Especializaciones
|
|
(hasta C++20) |
La forma esperada de hacer que un tipo definido por el programa sea intercambiable es proporcionar una función no miembro swap en el mismo espacio de nombres que el tipo: consulte Swappable para más detalles.
Las siguientes sobrecargas ya están proporcionadas por la biblioteca estándar:
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++20)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++23)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++14)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++11)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++17)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
(C++17)
|
especializa el algoritmo
std::swap
(función) |
|
(C++17)
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
especializa el algoritmo
std::swap
(plantilla de función) |
|
|
(C++17)
|
especializa el algoritmo
std::swap
(función) |
|
(C++23)
|
especializa el algoritmo
std::swap
(función) |
|
(C++20)
|
especializa el algoritmo
std::swap
(función) |
|
(C++23)
|
especializa el algoritmo
std::swap
(función) |
|
(C++20)
|
especializa el algoritmo
std::swap
(función) |
|
(C++20)
|
especializa el algoritmo
std::swap
(función) |
Ejemplo
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // error, los requisitos de tipo no se cumplen swap(p, q); // OK, ADL encuentra la función `swap` amiga apropiada std::cout << p << ' ' << q << '\n'; }
Salida:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 227 | C++98 |
T
no se requería que fuera
CopyConstructible
o
DefaultConstructible
(un objeto temporal de tipo
T
podría no poder construirse)
|
T
también se requiere que
sea CopyConstructible |
| LWG 809 | C++98 | los arreglos no podían intercambiarse | se añadió la sobrecarga (2) |
| LWG 2554 | C++11 |
intercambiar arreglos multidimensionales nunca
puede ser noexcept debido a problemas de búsqueda de nombres |
se hizo funcionar |
Véase también
|
(C++20)
|
intercambia los valores de dos objetos
(objeto de punto de personalización) |
|
intercambia los elementos apuntados por dos iteradores
(plantilla de función) |
|
|
intercambia dos rangos de elementos
(plantilla de función) |
|
|
(C++14)
|
reemplaza el argumento con un nuevo valor y devuelve su valor anterior
(plantilla de función) |