Verwendung von Move Constructors / Assignments

Ich habe gesucht, kann aber die Antwort auf "Wann" nicht finden, um sie zu verwenden. Ich höre immer wieder, dass es gut ist, weil es mir diese zusätzliche Kopie erspart. Ich habe es in jede Klasse gesteckt, die ich hatte, aber einige davon schienen für einige Klassen nicht sinnvoll zu sein: S Ich habe unzählige Tutorials zu LValues ​​und RValues ​​und std :: move vs. std :: copy vs. memcpy gelesen gegen memmove, etc. Und sogar über throw () nachlesen, aber ich bin mir nicht sicher, wann ich das verwenden soll.

Mein Code sieht so aus:

struct Point
{
    int X, Y;

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

    //All my other operators here..
};

Dann habe ich so ein Klassenarray (RAII sorta thing):

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

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

Soll ich einen Verschiebungs- und einen Kopierkonstruktor verwenden? Ich hatte es in der Point-Klasse, aber es fühlte sich komisch an, also entfernte ich es. Dann hatte ich es in der PA-Klasse, aber ich dachte, dass es nicht viel bringt, also habe ich es auch entfernt. Dann hat sich mein Compiler in meiner Bitmaps-Klasse beschwert, Zeiger-Mitglieder zu haben, aber keine Überladung, also habe ich Folgendes getan:

//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);
}

Ist das richtig? Habe ich etwas Schlimmes oder Falsches getan? Muss ich werfen ()? Sollten meine Zuweisungs- und Verschiebungszuweisungsoperatoren tatsächlich so sein? Benötige ich eine Kopieraufgabe? Ahh so viele Fragen: c Das letzte Forum, in dem ich gefragt habe, konnte nicht alle beantworten, so dass ich verwirrt war. Schließlich sollte ich unique_ptr für Bytes verwenden? (Das ist ein Array von Bytes / Pixeln.)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage