2009-07-12 15 views

Antwort

165
Beta_ab&& 
Beta::toAB() const { 
    return move(Beta_ab(1, 1)); 
} 

Dies gibt eine baumelnde Referenz, genau wie bei dem L-Wert-Referenzfall. Nachdem die Funktion zurückgegeben wurde, wird das temporäre Objekt zerstört. Sie sollten Beta_ab Wert zurückgeben, wie die folgende

Beta_ab 
Beta::toAB() const { 
    return Beta_ab(1, 1); 
} 

Nun, es bewegt sich richtig ein temporäres Beta_ab Objekt in den Rückgabewert der Funktion. Wenn der Compiler dies kann, wird die Verschiebung vollständig vermieden, indem RVO (Rückgabewertoptimierung) verwendet wird. Nun können Sie die folgende

Beta_ab ab = others.toAB(); 

tun und es wird die temporäre in ab bewegen konstruieren oder RVO tun wegzulassen einen Schritt tun oder ganz kopieren. Ich empfehle Ihnen, BoostCon09 Rvalue References 101 zu lesen, was die Angelegenheit erklärt und wie (N) RVO zufällig damit interagiert.


Ihr Fall der Rückgabe eines Rvalue Verweises wäre eine gute Idee bei anderen Gelegenheiten. Stellen Sie sich vor, Sie haben eine getAB() Funktion, die Sie oft auf einem temporären aufrufen. Es ist nicht optimal, wenn es einen konstanten Wert für Rvalue-Provisorien liefert. Sie können es auf diese Note

struct Beta { 
    Beta_ab ab; 
    Beta_ab const& getAB() const& { return ab; } 
    Beta_ab && getAB() && { return move(ab); } 
}; 

implementieren möchten, dass move in diesem Fall ist nicht optional, weil ab weder eine lokale automatisch noch eine temporäre rvalue ist. Nun wird das ref-Qualifikationsspiel&& sagt, dass die zweite Funktion auf rvalue Provisorien aufgerufen wird, die folgende Bewegung zu machen, statt Kopie

Beta_ab ab = Beta().getAB(); 
+32

Ich hatte immer das baumelnde Referenz Problem angenommen ging automatisch weg, wenn der Rückgabetyp war eine r-Wert-Referenz. Ich bin froh, dass ich mich durchgerungen habe, bevor es mich gebissen hat. Stack zerschlagen Bugs saugen. –

+17

:) Wirklich, Rvalue Referenzen sind "nur Referenzen" wie lvalue Referenzen sind. Sie kopieren oder speichern nichts. –

+0

Und selbst wenn es den Konstruktoren nicht hilft, weiß der Compiler etwas, dass es automatisch einen Rvalue-Ref für Sie sicher zurückgeben kann. Laut meinen Experimenten ist 'return x;' das gleiche wie 'return std :: move (x)'. (wobei 'x 'eine lokale Variable ist (d. h. dieser Punkt, den ich gemacht habe, trifft nicht direkt auf die ursprüngliche Frage zum Zurückgeben eines temporären) zu). –

Verwandte Themen