Path: csiph.com!eternal-september.org!feeder.eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: Stefan Reuther Newsgroups: de.comp.lang.iso-c++ Subject: Re: rvalue ref. Date: Thu, 24 May 2018 19:48:06 +0200 Organization: A noiseless patient Spider Lines: 47 Sender: "Moderation de.comp.lang.iso-c++" Approved: White-List Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: h2725194.stratoserver.net; posting-host="6c667223cadfb3e05d540ce80c80b9b1"; logging-data="23705"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+KPdeVI1/pfkuDx1E8NpvS" User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 Hamster/2.1.0.1538 Xref: csiph.com de.comp.lang.iso-c++:2076 Am 24.05.2018 um 10:15 schrieb Markus Donath: > On 05/18/2018 07:24 PM, Stefan Reuther wrote: >> Mir ist gerade nicht eingängig, wie die Funktionen tatsächlich genau das >> gleiche tun können wollen. Die erste soll doch das Objekt unverändert >> lassen, während die zweite Dinge aus dem Objekt heraus moven können >> soll. Das mag zwar im Quelltext dann gleich aussehen, macht aber was >> anderes. > > Beide Funktionen woolen das übergebene Objekt nicht verändern, aber bei > der rvalue-Variante kann ggf. eine Zwischenkopie gespart werden: > > vector v1; > ... > test(v1); // Aufruf von test(const vector&) > > vector add(const vector& v1, const vector v2); > test(add(v1, v2)); // Aufruf von test(vector&&) > > Hätte ich die rvalue-Variante nicht, würde auch für den 2. Aufruf die > const-ref-Variante benutzt. Dies macht aber eine Kopie von add(v1, v2), > die aber eigentlich nicht benötigt wird, oder? Nein, dann würde ein temporäres Objekt erzeugt mit dem Ergebnis von 'add(v1, v2)', die const-Referenz würde an dieses Objekt gebunden, und nach dem Funktionsaufruf 'test' wird das Objekt zerstört. Bei 'test(vector&&)' passiert genau das gleiche, nur dass hier die Funktion 'test' das übergebene Objekt plündern darf. Dadurch entsteht erst die mögliche Ersparnis. >> Mir fehlt ja schon seit geraumer Zeit ein >> >> template void test(Q t& x); >> >> für diesen und andere Zwecke. > > Verstehe ich leider nicht. Ich habe halt öfter Funktionen, in denen das gleiche drinsteht, aber verschiedener Objektcode erzeugt werden soll. Forwarder-Funktionen ("return m_foo.getX()") in const/nonconst, und eben Funktionen mit plünderbaren Parametern ('T&&') oder konstanten ('const T&'). Außer Makros hat C++ da nichts zu bieten, um die doppelte Schreibarbeit zu vermeiden. Stefan