Repräsentiert ein solcher Rückgabetyp in c ++ 11 etwas Sinnvolles?
%Vor% Ich hoffe, dass grabStuff
einen Fehler bei der Kompilierung auslösen sollte, wenn R
keinen Verschiebungskonstruktor hat, da dies den Rückgabetyp anscheinend nicht erlaubt, einen Kopierkonstruktor zu verwenden
Wie immer müssen Sie bei der Rückgabe von Referenzen einen Verweis auf eine Komponente zurückgeben, die nach der Rückkehr der Funktion noch aktiv ist. Wie Sie das tun, liegt an Ihnen. Beispiel:
%Vor% Das typischere Beispiel für die Rückgabe einer R-Wert-Referenz ist std::move
selbst, die einen Verweis auf die Sache zurückgibt, die Sie an übergeben (und es liegt somit in der Verantwortung des Aufrufers, eine gültige Eingabe anzugeben) ).
Es kann sinnvoll sein, je nachdem, was Sie damit machen wollen und wie Sie die Funktion implementiert haben.
Tatsächlich ist std::move
return type T&&
(rvalue-Referenz), was bedeutungsvoll ist, da es den Zweck der Existenz von std::move
in der C ++ 11-Bibliothek definiert:
Wenn der Rückgabetyp einer Funktion eine rvalue-Referenz ist, dann ist das Ergebnis des Funktionsaufrufs ein xvalue; Wenn der Rückgabetyp keine Referenz ist, ist das Ergebnis des Funktionsaufrufs ein Prvalue.
Sowohl xvalue als auch prvalue sind R-Werte, zwischen ihnen gibt es kleinere Unterschiede, mehr wie Unterschiede zwischen Referenz und Nicht-Referenz. Beispielsweise kann ein xvalue einen unvollständigen Typ aufweisen, während ein prvalue normalerweise einen vollständigen Typ oder den void-Typ aufweist. Wenn typeid auf einen xvalue angewendet wird, dessen Typ ein polymorpher Klassentyp ist, bezieht sich das Ergebnis auf den dynamischen Typ. und für prvalue bezieht sich das Ergebnis auf den statischen Typ.
Für Ihre Deklarationsanweisung T instance = grabStuff<T>();
, wenn T ein Klassentyp ist, denke ich, dass in diesem Kontext kein Unterschied zwischen xvalue und prvalue besteht.
Der Initialisierer ist ein rvalue, daher bevorzugt der Compiler einen Move-Konstruktor. Wenn jedoch kein move -Konstruktor deklariert ist und ein Kopierkonstruktor mit dem const reference -Parameter deklariert ist, wird dieser Kopierkonstruktor ausgewählt, und es liegt kein Fehler vor. Ich weiß nicht warum, warum soll das ein Fehler sein? Wenn dies ein Fehler ist, wird jeder alte Code falsch sein, wenn ein Objekt von einem R-Wert initialisiert wird.
Tags und Links c++ c++11 rvalue-reference