Cuándo usar Move Constructors / Assignments

He buscado pero no puedo encontrar la respuesta a "Cuándo" para usarlos. Solo escucho que es bueno porque me ahorra esa copia extra. Lo coloqué en todas las clases que tenía, pero de alguna manera eso no parecía tener sentido para algunas clases: S He leído innumerables tutoriales en LValues ​​y RValues ​​y std :: move vs. std :: copy vs. memcpy vs. memmove, etc. E incluso lea sobre el lanzamiento () pero tampoco estoy seguro de cuándo usarlo.

Mi código se ve como:

struct Point
{
    int X, Y;

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

    //All my other operators here..
};

Entonces tengo una matriz de clase de eso me gusta (RAII sorta cosa):

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

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

¿Debo usar un constructor de movimiento y un constructor de copia? Lo tenía en la clase de puntos, pero se sentía raro, así que lo eliminé. Luego lo tuve en la clase de PA, pero pensé que no iba a hacer mucho, así que lo eliminé también. Luego, en mi clase de mapas de bits, mi compilador se quejaba de tener miembros punteros pero sin sobrecarga, así que hice:

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

¿Es esto correcto? ¿Hice algo malo o malo? ¿Necesito lanzar ()? ¿Deben ser mis operadores de asignación y asignación de movimiento realmente iguales? ¿Necesito una copia de la asignación? Ahh tantas preguntas: c El último foro que pregunté no pudo responder a todos, así que me quedé confundido. Por último, ¿debería usar unique_ptr para bytes? (Que es una matriz de bytes / píxeles).

Respuestas a la pregunta(3)

Su respuesta a la pregunta