Pour décider s'il est judicieux de prendre en charge une version personnalisée de swap à l'ère post-C+11x, je voulais savoir quelles fonctions std appellent swap et est-ce qu'elles bénéficieront toujours d'une version implémentée par l'utilisateur même en présence d'un move-constructeur et d'une move-assignment ?
Réponse
Trop de publicités?Je ne pense pas que la bibliothèque standard appellera votre fonction swap,
La bibliothèque standard appellera votre implémentation de swap
dans les endroits où elle requiert que le type soit échangeable, par exemple dans l'implémentation de std::pair<>::swap
. En plus de cela, d'autres codes pourraient également utiliser votre swap
pour implémenter leur propre fonction swap
. Pour ces cas, si vous avez implémenté le constructeur de déplacement et l'assignation de déplacement, l'implémentation standard de std::swap
devrait mais n'est pas obligée (AFAIK) d'utiliser le constructeur/assignation de déplacement.
L'implémentation de swap
pour un type qui implémente déjà les opérations de déplacement est une fonction de trois lignes, donc je vous conseille de l'implémenter de toute façon :
void swap(mytype& lhs, mytype& rhs) {
mytype tmp(std::move(lhs));
lhs = std::move(rhs);
rhs = std::move(tmp);
}