Il est sûr car rien n'est créé pendant l'opération de swap. Seuls les membres de données de la classe std::vectorsont échangés.
Considérez le programme de démonstration suivant qui indique clairement comment les objets de la classe std::vectorsont échangés.
#include <iostream>
#include <utility>
#include <iterator>
#include <algorithm>
#include <numeric>
class A
{
public:
explicit A( size_t n ) : ptr( new int[n]() ), n( n )
{
std::iota( ptr, ptr + n, 0 );
}
~A()
{
delete []ptr;
}
void swap( A & a ) noexcept
{
std::swap( ptr, a.ptr );
std::swap( n, a.n );
}
friend std::ostream & operator <<( std::ostream &os, const A &a )
{
std::copy( a.ptr, a.ptr + a.n, std::ostream_iterator<int>( os, " " ) );
return os;
}
private:
int *ptr;
size_t n;
};
int main()
{
A a1( 10 );
A a2( 5 );
std::cout << a1 << '\n';
std::cout << a2 << '\n';
std::cout << '\n';
a1.swap( a2 );
std::cout << a1 << '\n';
std::cout << a2 << '\n';
std::cout << '\n';
return 0;
}
La sortie du programme est
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4 5 6 7 8 9
Comme vous ne voyez que les membres de données ptret nsont échangés dans l'échange de fonction membre. Aucune ressource supplémentaire n'est utilisée.
Une approche similaire est utilisée dans la classe std::vector.
Quant à cet exemple
std::vector<Widget> WidgetVector;
std::vector<Widget2> Widget2Vector;
puis il y a des objets de différentes classes. L'échange de fonction membre est appliqué aux vecteurs du même type.