std:: swap
|
Défini dans l'en-tête
<algorithm>
|
(jusqu'à C++11)
|
|
|
Défini dans l'en-tête
<utility>
|
(depuis C++11)
|
|
|
Défini dans l'en-tête
<string_view>
|
||
|
template
<
class
T
>
void swap ( T & a, T & b ) ; |
(1) |
(conditionnellement noexcept depuis C++11)
(constexpr depuis C++20) |
|
template
<
class
T2,
std::
size_t
N
>
void swap ( T2 ( & a ) [ N ] , T2 ( & b ) [ N ] ) ; |
(2) |
(conditionnellement noexcept depuis C++11)
(constexpr depuis C++20) |
Échange les valeurs données.
|
Cette surcharge participe à la résolution de surcharge seulement si std:: is_move_constructible_v < T > && std:: is_move_assignable_v < T > est true . |
(depuis C++17) |
|
Cette surcharge participe à la résolution de surcharge seulement si std:: is_swappable_v < T2 > est true . |
(depuis C++17) |
Table des matières |
Paramètres
| a, b | - | les valeurs à échanger |
| Exigences de type | ||
-
T
doit satisfaire aux exigences de
CopyConstructible
et
CopyAssignable
(jusqu'à C++11)
MoveConstructible
et
MoveAssignable
(depuis C++11)
.
|
||
-
T2
doit satisfaire aux exigences de
Swappable
.
|
||
Valeur de retour
(aucun)
Exceptions
|
(aucun) |
(jusqu'à C++11) |
|
noexcept
spécification :
noexcept
(
std::
is_nothrow_move_constructible
<
T
>
::
value
&&
|
(depuis C++11) |
|
noexcept
spécification :
La recherche de l'identifiant
noexcept
(
noexcept
(
swap
(
*
a,
*
b
)
)
)
swap
dans la spécification d'exception trouve ce modèle de fonction en plus de tout ce qui est trouvé par les règles de recherche habituelles, rendant la spécification d'exception équivalente à C++17
std::is_nothrow_swappable
.
|
(depuis C++11)
(jusqu'à C++17) |
|
noexcept
spécification :
noexcept
(
std::
is_nothrow_swappable_v
<
T2
>
)
|
(depuis C++17) |
Complexité
Spécialisations
|
|
(jusqu'à C++20) |
La manière attendue de rendre un type défini par le programme interchangeable est de fournir une fonction non-membre swap dans le même espace de noms que le type : voir Swappable pour plus de détails.
Les surcharges suivantes sont déjà fournies par la bibliothèque standard :
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(fonction template) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(fonction template) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(fonction template) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++20)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++23)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
spécialise l'algorithme
std::swap
(fonction template) |
|
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++14)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++11)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++17)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
(C++17)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++17)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
|
(C++17)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++23)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++20)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++23)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++20)
|
spécialise l'algorithme
std::swap
(fonction) |
|
(C++20)
|
spécialise l'algorithme
std::swap
(fonction) |
Exemple
#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); // erreur, les exigences de type ne sont pas satisfaites swap(p, q); // OK, ADL trouve la fonction `swap` amie appropriée std::cout << p << ' ' << q << '\n'; }
Sortie :
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 227 | C++98 |
T
n'était pas requis d'être
CopyConstructible
ou
DefaultConstructible
(un objet temporaire de type
T
pourrait ne pas pouvoir être construit)
|
T
est également requis d'
être CopyConstructible |
| LWG 809 | C++98 | les tableaux ne pouvaient pas être échangés | surcharge ajoutée (2) |
| LWG 2554 | C++11 |
l'échange de tableaux multidimensionnels ne peut jamais
être noexcept en raison de problèmes de recherche de nom |
rendu fonctionnel |
Voir aussi
|
(C++20)
|
échange les valeurs de deux objets
(objet de point de personnalisation) |
|
échange les éléments pointés par deux itérateurs
(modèle de fonction) |
|
|
échange deux plages d'éléments
(modèle de fonction) |
|
|
(C++14)
|
remplace l'argument par une nouvelle valeur et retourne sa valeur précédente
(modèle de fonction) |