Sono confuso su quando un costruttore di mosse viene chiamato contro un costruttore di copie. che ho letto le seguenti fonti:Quando viene richiamato Move Constructor?
Move constructor is not getting called in C++0x
Move semantics and rvalue references in C++11
Tutte queste fonti sono o troppo complicata (Voglio solo un semplice esempio) o solo mostrano come scrivere move constructor, ma non come chiamarlo. Ive ha scritto un problema semplice per essere più precisi:
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;
}
attualmente A, B, e C tutti hanno differenti valori di puntatore. Vorrei che A avesse un nuovo puntatore, B che avesse il vecchio puntatore di C e C che avesse un puntatore nullo.
un po 'fuori tema, ma se si potesse suggerire una documentazione in cui potrei conoscere in dettaglio queste nuove funzionalità sarei grato e probabilmente non avrei bisogno di fare molte altre domande.
su una questione in parte correlata, si potrebbe voler controllare la copia e scambiare idioma http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom per la vostra assegnazione operatore. – undu
[domande frequenti correlate] (http: // stackoverflow.it/questions/3106110 /) – fredoverflow