Вопросы об операторе назначения переезда

Представьте себе следующий класс, который управляет ресурсом (мой вопрос касается только оператора присваивания перемещения):

struct A
{
    std::size_t s;
    int* p;
    A(std::size_t s) : s(s), p(new int[s]){}
    ~A(){delete [] p;}
    A(A const& other) : s(other.s), p(new int[other.s])
    {std::copy(other.p, other.p + s, this->p);}
    A(A&& other) : s(other.s), p(other.p)
    {other.s = 0; other.p = nullptr;}
    A& operator=(A const& other)
    {A temp = other; std::swap(*this, temp); return *this;}
    // Move assignment operator #1
    A& operator=(A&& other)
    {
        std::swap(this->s, other.s);
        std::swap(this->p, other.p);
        return *this;
    }
    // Move assignment operator #2
    A& operator=(A&& other)
    {
        delete [] p;
        s = other.s;
        p = other.p;
        other.s = 0;
        other.p = nullptr;
        return *this;
     } 
};

Вопрос:

Каковы преимущества и недостатки двух операторов присваивания перемещения № 1 и № 2, описанных выше? Я считаю, что единственное отличие, которое я вижу, в том, чтоstd::swap сохраняет хранилище lhs, однако я не вижу, как это было бы полезно, так как значения в любом случае будут уничтожены. Может быть, единственное время будет с чем-то вродеa1 = std::move(a2);, но даже в этом случае я не вижу никакой причины использовать # 1.

Ответы на вопрос(3)

Ваш ответ на вопрос