C++ Pendant zu Java Objekt Referenz
-
Spannend wird es nur hier:
Foo makeFoo(bool condition) { Foo f1{"blah"}; Foo f2{"blubberdieblubb"}; // [code...] // a) return condition ? f1 : f2; // b) return std::move(condition ? f1 : f2); }
Hier ist rechts ja ein ?-:-Konstrukt. Mit so einer Konstruktion verbaut man sich das automatische move.
-
Also theoretisch könnte man einen absoluten Grossteil der Verwendungen eines automatischen Objektes in return statements durch einen Move ersetzen. Es gibt aber eben auch Ausnahmen (überwiegend realitätsferner Natur...) und deshalb ist es nur fuer simple Identifier gegeben.
-
@Columbo sagte in C++ Pendant zu Java Objekt Referenz:
Es haette also schon rein technisch niemals geholfen, das zu schreiben
Richtig. Ich hab das Kommentar bloss dazugeschrieben weil es in dem Fall nicht nur unnütz ist sondern sogar schadet.
-
@hustbaer ich weiss, deshalb ja auch als "Ergänzung"
-
@wob sagte in C++ Pendant zu Java Objekt Referenz:
Spannend wird es nur hier:
Foo makeFoo(bool condition) { Foo f1{"blah"}; Foo f2{"blubberdieblubb"}; // [code...] // a) return condition ? f1 : f2; // b) return std::move(condition ? f1 : f2); }
Hier ist rechts ja ein ?-:-Konstrukt. Mit so einer Konstruktion verbaut man sich das automatische move.
Also wenn nicht klar ist welches Objekt zurückgegeben wird, ist es sinnvoller mit move zu arbeiten um Kopien zu vermeiden?
-
@CppConst sagte in C++ Pendant zu Java Objekt Referenz:
Also wenn nicht klar ist welches Objekt zurückgegeben wird, ist es sinnvoller mit move zu arbeiten um Kopien zu vermeiden?
Im Allgemeinen vermutlich ja.
Wobei man den Code auch u.U. umschreiben kann. Wenn
f1
undf2
in[code...]
nicht gebraucht werden, dann wäre es besser zu schreiben:Foo makeFoo(bool condition) { // [code...] if (condition) return {"blah"}; else return {"blubberdieblubb"}; }
Denn dann greift wieder RVO, und man spart sich das 2. unnötige
Foo
Objekt zu erzeugen. (Diesmal wirklich RVO und nicht NRVO.)