r-Wert Referenz Rückgabetyp Semantik?

8

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

    
lurscher 14.04.2012, 15:52
quelle

3 Antworten

5

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) ).

    
Kerrek SB 14.04.2012, 16:20
quelle
1

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:

Nawaz 14.04.2012 16:01
quelle
1

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.

    
Cosyn 15.04.2012 02:53
quelle

Tags und Links