Ich verwende den Code unten, um Testkopie elision:Warum elision nicht mit std :: move arbeiten?
class foo
{
public:
foo() {cout<<"ctor"<<endl;};
foo(const foo &rhs) {cout<<"copy ctor"<<endl;}
};
int g(foo a)
{
return 0;
}
int main()
{
foo a;
g(std::move(a));
return 0;
}
ich erwartet hatte nur der Standard-Konstruktor aufgerufen werden würde, weil das Argument der g()
ein rvalue ist und Kopie wird elided werden. Das Ergebnis zeigt jedoch, dass sowohl der Standardkonstruktor als auch der Kopierkonstruktor aufgerufen werden. Warum?
Und wenn ich den Funktionsaufruf zu g(foo())
ändere, wird die Kopie gelöscht. Was ist der Unterschied zwischen den Rückgabetypen foo()
und std::move(a)
? Wie kann ich den Compiler auf einen Lvalue kopieren?
Sie können nicht.'g' nimmt seinen Parameter als Wert, so dass der Compiler sicherstellen muss, dass das übergebene Objekt von jedem Objekt verschieden ist, auf das vom aufrufenden Bereich zugegriffen werden kann. Wenn das übergebene Objekt ein lvalue ist, gibt es keine temporäre zu eliminieren und eine Kopie kann nicht entfernt werden. –
Wie viele Destruktor-Aufrufe haben Sie erwartet? ;) – curiousguy
Vielleicht möchtest du [lesen] (http://stackoverflow.com/a/11540204/252000) was "std :: move" tatsächlich macht. – fredoverflow