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