Реализация конструктора копирования(перемещения) через равно копирования (перемещения)

Хорошая ли идея писать так:

class A
{
public: 
    A(const A& other)
    {
        //Вызов равно копирования.
        (*this) = other;
    }    

public:
    A& operator =(const A& other)
    {
         //Какая-то реализация...
         return *this;
    }
};

Ответы (1 шт):

Автор решения: Harry

Просто жуткая! потому что в присваивании вы должны аккуратно уничтожить объект, в который копируете - а для этого первоначально его создать...

Вот наоборот - куда лучше :)

Пишем функцию swap(A& other), которая обменивает содержимое двух объектов, и конструктор копирования. После этого присваивание (а не "равно") пишется через конструктор копирования как

A& operator=(const A& other)
{
    A tmp(other);
    swap(tmp);
    return *this;
}

Даже проверять на равенство this == &other - и то необязательно, отработает корректно. Конечно, можно его добавить - чисто вящей эффективности для...

Можно даже короче -

A& operator=(A other)
{
    swap(other);
    return *this;
}
→ Ссылка