Вопросы об операторе назначения переезда
Представьте себе следующий класс, который управляет ресурсом (мой вопрос касается только оператора присваивания перемещения):
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.