Deine Aussage ist falsch, es reicht ein Gegenbeispiel
.
Außerdem behauptest und folgerst du schon wieder ziemlich Steil ohne Beweis, unschön.
1. Fall (Hier zum direkten Testen http://www.tutorialspoint.com/compile_cpp11_online.php):
Code:
...
foo mve(foo&& f){
//...stuff
return std::move(f);
}
foo cpy(foo&& f){
return f;
}
...
Siehe letzter Beitrag, analoges Praxis Beispiel :
http://stackoverflow.com/questions/...ning-a-value-from-a-function-to-avoid-to-copy
Hier würde ich davon ausgehen, dass das ein Compiler-Fehler oder ein Fehler im Standard ist.
A & a wäre eine Referenz auf ein Objekt außerhalb des Methodenkontext und damit ein lvalue.
A && a ist auch eine Referenz und der Compiler übersieht anscheinend die rvalue Garantie und erzeugt eine Kopie damit er da überhaupt ein Return machen kann.
Ob das nach Standard korrekt ist weiß ich nicht (ich würde davon ausgehen, dass dem nicht so ist) aber im Sinne des Erfinders ist es auf jeden Fall nicht. Interessant wäre hier mal verschiedene Compiler zu vergleichen.
Da man hier eine Referenz bekommt würde ich an der Stelle aber sowieso eine Referenz zurückgeben.
2.Fall
Code:
class foo{
//Ctors...
void process(); //work on ptr data
std::unique_ptr<data> getResults() { return std::move(ptr);} //ohne move gibt es hier eine Fehlermeldung, da ptr nicht Funktionslokales Objekt ist.
...
Da hast Du Recht. In deinem Fall geht es jedoch um lokale Instanzen (oder um Instanzen die lokal sein sollten, die Du aber auf den Heap schmeißt und dann unique_ptr drumrumbastelst damit sie sich wie lokale instanzen verhalten).
Ich muss Dir recht geben, dass ich mich hier falsch ausgedrückt habe.
Deswegen mache ich es noch mal vorsichtiger:
Ich kenne keine Fälle wo es sinnvoll ist ein "return std::move()" zu machen. Wenn das notwendig wird ist das in der Regel ein Red-flag, dass man irgend etwas grundsätzlich falsch macht. Ähnlich wie bei
mutable. Das habe ich auch schon mal verwendet und dann noch mal drüber nachgedacht und es richtig gemacht.