スワップ操作中には何も作成されないため、安全です。クラスのデータメンバーのみstd::vectorが交換されます。
クラスのオブジェクトがどのようにstd::vectorスワップされるかを明確にする次のデモプログラムを考えてみましょう。
#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;
}
プログラム出力は
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 
あなただけのデータメンバーを見るとわかるようにptrし、nメンバ関数のスワップで交換されます。どちらの追加リソースも使用されません。
クラスでも同様のアプローチが使用されstd::vectorます。
この例は
std::vector<Widget> WidgetVector;
std::vector<Widget2> Widget2Vector;
次に、異なるクラスのオブジェクトがあります。メンバー関数swapは、同じタイプのベクトルに適用されます。