2016-11-02 2 views
1

Mein Code sieht aus wieWarum versucht der Compiler, den Rückgabewert zu kopieren, anstatt ihn zu verschieben?

// definition of class 'Foo' 
class Foo 
{ 
    private: 
    vector<Bar> v; 
    public: 
    ... 
    Foo(Foo&&) = default; // move constructor 
}; 

// definition of function 'f' 
Foo f() 
{ 
    Foo x; 
    DoStuff(x); 
    return x; 
} 

// Somewhere in main 
result = f(); // I am aiming to move 'x' to 'result' 

Als ich mich

EAL_1.6.cpp:314:13: error: object of type 'Foo' cannot be assigned because its copy assignment operator is implicitly deleted 
     x = f(x); 
      ^
EAL_1.6.cpp:232:5: note: copy assignment operator is implicitly deleted because 'Foo' has a user-declared move constructor 
    Foo(Foo&&) = default; 
    ^

erhalten zu kompilieren versuchen wurde ich

return move(x); 

zu versuchen versucht, aber es scheint nicht eine clevere Lösung nach zu sein zu this post. Ich verstehe, dass der Cop-Konstruktor gelöscht wird, wenn man einen Move-Konstruktor definiert (wie in this post erklärt), aber ich verstehe nicht, wie man dem Compiler sagt, dass ich möchte, dass x in "result" verschoben wird.

+0

Der Fehler und der Code zeigen zwei völlig verschiedene Dinge. Auch was ist 'Bar'? – 0x499602D2

+1

Haben Sie 'Foo & operator = (Foo &&) = default;'? Weil es nicht implizit generiert wird. – krzaq

Antwort

7

Dies:

result = f(); // I am aiming to move 'x' to 'result' 

ist kein Versuch, bei Umzug Bau, es ist ein Versuch, Bewegung Zuordnung. Und, wie der Compiler sagt Ihnen:

Objekt vom Typ Foo kann nicht zugeordnet werden, da seine Kopie Zuweisungsoperator implizit

gelöscht

Der Kopierzuweisungsoperator implizit gelöscht (und der Umzug Zuweisungsoperator ist einfach ganz fehlen), weil Sie den Move-Konstruktor hinzugefügt haben. Vermutlich, wenn Ihr Typ bewegbar ist, ist er auch zuweisbar. Also einfach hinzufügen:

Foo& operator=(Foo&&) = default; 
+0

Sie haben * wirklich * gut in kurzer Zeit. – 0x499602D2

+0

@ 0x499602D2 Danke! – Barry

Verwandte Themen