Quando usar Mover Construtores / Designações

Eu procurei, mas não consegui encontrar a resposta para "Quando" para usá-los. Eu continuo ouvindo que é bom porque me poupa essa cópia extra. Eu andei colocando em todas as classes que eu tinha, mas de alguma forma isso não parecia fazer sentido para algumas classes: S eu li inúmeros tutoriais sobre LValues ​​e RValues ​​e std :: move vs. std :: copy vs. memcpy vs. memmove, etc. E até mesmo ler em throw () mas não tenho certeza sobre quando usar isso também.

Meu código parece:

struct Point
{
    int X, Y;

    Point();
    Point(int x, int y);
    ~Point();

    //All my other operators here..
};

Então eu tenho uma matriz dessa classe (coisa de RAII sorta):

class PA
{
    private:
        std::vector<Point> PointsList;

    public:
        PA();
        //Variadic Template constructor here..
        ~PA();
        //Operators here..
 };

Devo estar usando um construtor de movimento e um construtor de cópia? Eu tinha na Classe Point, mas parecia estranho, então eu removi. Então eu tive isso na aula de PA, mas achei que não faria muita coisa, então também o removi. Então, na minha classe de bitmaps meu compilador estava reclamando sobre ter membros de ponteiro, mas sem sobrecarga, então eu fiz:

//Copy Con:
BMPS::BMPS(const BMPS& Bmp) : Bytes(((Bmp.width * Bmp.height) != 0) ? new RGB[Bmp.width * Bmp.height] : nullptr), width(Bmp.width), height(Bmp.height), size(Bmp.size), DC(0), Image(0)
{
    std::copy(Bmp.Bytes, Bmp.Bytes + (width * height), Bytes);
    BMInfo = Bmp.BMInfo;
    bFHeader = Bmp.bFHeader;
}

//Move Con:
BMPS::BMPS(BMPS&& Bmp) : Bytes(nullptr), width(Bmp.width), height(Bmp.height), size(Bmp.size), DC(0), Image(0)
{
    Bmp.Swap(*this);
    Bmp.Bytes = nullptr;
}

//Assignment:
BMPS& BMPS::operator = (BMPS Bmp)
{
    Bmp.Swap(*this);
    return *this;
}

//Not sure if I need Copy Assignment?

//Move Assignment:
BMPS& BMPS::operator = (BMPS&& Bmp)
{
    this->Swap(Bmp);
    return *this;
}

//Swap function (Member vs. Non-member?)
void BMPS::Swap(BMPS& Bmp) //throw()
{
    //I was told I should put using std::swap instead here.. for some ADL thing.
    //But I always learned that using is bad in headers.
    std::swap(Bytes, Bmp.Bytes);
    std::swap(BMInfo, Bmp.BMInfo);
    std::swap(width, Bmp.width);
    std::swap(height, Bmp.height);
    std::swap(size, Bmp.size);
    std::swap(bFHeader, Bmp.bFHeader);
}

Isso está correto? Eu fiz algo ruim ou errado? Preciso jogar ()? Os meus operadores de designação e movimentação devem ser os mesmos? Preciso de uma tarefa de cópia? Ahh tantas perguntas: c O último fórum que eu perguntei não poderia responder a todos, então fiquei confuso. Por fim, devo usar unique_ptr para Bytes? (Que é uma matriz de bytes / pixels.)

questionAnswers(3)

yourAnswerToTheQuestion