Groups | Search | Server Info | Login | Register
Groups > de.comp.lang.iso-c++ > #2076
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Newsgroups | de.comp.lang.iso-c++ |
| Subject | Re: rvalue ref. |
| Date | 2018-05-24 19:48 +0200 |
| Organization | A noiseless patient Spider |
| Message-ID | <pe74tn.308.1@stefan.msgid.phost.de> (permalink) |
| References | <pdj86k$67p$1@news.albasani.net> <pdn99a.3d8.1@stefan.msgid.phost.de> <pe5sbs$paq$1@news.albasani.net> |
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<int> v1;
> ...
> test(v1); // Aufruf von test(const vector<int>&)
>
> vector<int> add(const vector<int>& v1, const vector<int> v2);
> test(add(v1, v2)); // Aufruf von test(vector<int>&&)
>
> 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<int>&&)' 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<qualifier Q> 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
Back to de.comp.lang.iso-c++ | Previous | Next — Previous in thread | Find similar
rvalue ref. Markus Donath <nntp@online.de> - 2018-05-17 08:41 +0200
Re: rvalue ref. Markus Schaaf <mschaaf@elaboris.de> - 2018-05-17 14:46 +0200
Re: rvalue ref. Florian Weimer <fw@deneb.enyo.de> - 2018-05-17 21:25 +0200
Re: rvalue ref. Stefan Reuther <stefan.news@arcor.de> - 2018-05-18 19:24 +0200
Re: rvalue ref. Markus Donath <nntp@online.de> - 2018-05-24 10:15 +0200
Re: rvalue ref. Adriaan van Oosten <avoosten@arcor.de> - 2018-05-24 14:50 +0200
Re: rvalue ref. Florian Weimer <fw@deneb.enyo.de> - 2018-05-24 18:20 +0200
Re: rvalue ref. Stefan Reuther <stefan.news@arcor.de> - 2018-05-24 19:48 +0200
csiph-web