2017-04-02 1 views
0

schauen Sie bitte auf den folgenden Beispielcode:Warum Move Constructor ist kein Anruf?

class testo 
{ 
public: 
    testo() 
    { 
     cout << " default " << endl; 
    } 

    testo(const testo & src) 
    { 
     cout << "copy " << endl; 
    } 
    testo(const testo && src) 
    { 
     cout << "move" << endl; 
    } 
    testo & operator=(const testo & rhs) 
    { 
     cout << " assigment" << endl; 
     return *this; 
    } 
    testo & operator= (const testo && rhs) 
    { 
     cout << "move" << endl; 
    } 

}; 

und dies ist meine Funktion und Hauptcode:

testo nothing(testo & input) 
{ 
return input; 
} 

int main() 
{ 
testo boj1 ; 
testo obj2(nothing(obj1)); 
return 1; 
} 

, wenn ich diesen Code i erwarten kompilieren und ausführen zu:

default // default constructor 

copy  // returning from the function 

move  // moving to the obj2 

aber wenn der Code ausgeführt wird, wird nur angezeigt:

default 

copy 

die Compiler Visual C++ 2015

+0

Fügen Sie den Code hinzu, den Sie zum Testen der Klasse verwendet haben. –

+0

Entfernen Sie das const-Qualifikationsmerkmal aus Ihrem Move-Konstruktor/move-Zuweisung – kreuzerkrieg

+0

Entschuldigung, ich habe die Funktion vergessen – mehdi

Antwort

0

Verschieben Signaturen als T&& definiert werden soll, nicht T const &&. Während es nichts in der Sprache gibt, das Sie davon abhält etwas zu deklarieren, macht es praktisch keinen Sinn: Sie wollen sich von diesem Objekt bewegen, aber es ist const und kann deshalb nicht seinen Zustand ändern lassen? Es ist ein Widerspruch zu Begriffen.

+0

danke für deine antwort aber. Entfernen des const-Schlüsselwortes .. hat nicht geholfen – mehdi