Wann wird Move Constructor aufgerufen?

Ich bin verwirrt darüber, wann ein Verschiebungskonstruktor gegen einen Kopierkonstruktor aufgerufen wird. Ich habe die folgenden Quellen gelesen:

Der Move-Konstruktor wird in C ++ 0x nicht aufgerufen

Verschieben von Semantik- und R-Wert-Referenzen in C ++ 11

msdn

Alle diese Quellen sind entweder überkompliziert (ich möchte nur ein einfaches Beispiel zeigen) oder zeigen nur, wie man einen Verschiebungskonstruktor schreibt, aber nicht, wie man ihn aufruft. Ich habe ein einfaches Problem geschrieben, um genauer zu sein:

const class noConstruct{}NoConstruct;
class a
{
private:
    int *Array;
public:
    a();
    a(noConstruct);
    a(const a&);
    a& operator=(const a&);
    a(a&&);
    a& operator=(a&&);
    ~a();
};

a::a()
{
    Array=new int[5]{1,2,3,4,5};
}
a::a(noConstruct Parameter)
{
    Array=nullptr;
}
a::a(const a& Old): Array(Old.Array)
{

}
a& a::operator=(const a&Old)
{
    delete[] Array;
    Array=new int[5];
    for (int i=0;i!=5;i++)
    {
        Array[i]=Old.Array[i];
    }
    return *this;
}
a::a(a&&Old)
{
    Array=Old.Array;
    Old.Array=nullptr;
}
a& a::operator=(a&&Old)
{
    Array=Old.Array;
    Old.Array=nullptr;
    return *this;
}
a::~a()
{
    delete[] Array;
}

int main()
{
    a A(NoConstruct),B(NoConstruct),C;
    A=C;
    B=C;
}

Derzeit haben A, B und C unterschiedliche Zeigerwerte. Ich möchte, dass A einen neuen Zeiger hat, B einen alten Zeiger von C und C einen Null-Zeiger.

etwas abseits des themas, aber wenn man eine dokumentation vorschlagen könnte, in der ich diese neuen funktionen im detail kennenlernen könnte, wäre ich dankbar und müsste wahrscheinlich nicht mehr viele fragen stellen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage