C++0x: Rvalue Reference für Rückgabe benutzen?
-
Guten Abend,
Vielleicht kommt meine heutige Frage ein oder zwei Jahre zu früh, aber ich versuche seit einiger Zeit, ein wenig fit zu werden mit dem letzten Draft von C++0x. Darum habe ich nun eine Frage zu Rvalue References, wobei eine Klasse der folgenden Art gegeben sei:
template<typename ...> class enumerable : public virtual ... { public: virtual handle<enumerator<...> > get_enumerator() const = 0; };Jeder Aufruf von
get_enumeratorerzeugt ein neuesenumerator-Objekt, welches mit diesenhandles verwaltet wird. Ein Konstruktor-Aufruf für einhandleist wenn möglich zu vermeiden.Ist das der typische Fall, für den Rvalue References gedacht sind? Ich werde leider noch nicht wirklich schlau aus den Erklärungen, die mir zur Verfügung stehen

MfG
-
Du musst schon konkreter werden.
Prinzipiell ist der Haupteinsatzzweck von Rvalue-Referenzen der "Move-Konstruktor". Sonst braucht Otto Normalverbraucher die höchst selten. Ich würde sogar soweit gehen und sagen, dass Anfänger Rvalue-Referenzen häufig missbrauchen bzw falsch verstehen. Wenn man da auf der sicheren Seite sein will, vermeidet man sie einfach. Funktionen, die Rvalue-Referenzen zurückgeben sind zu vermeiden. Es gibt im Prinzip nur zwei Funktionen, bei denen das Zurückgeben von Rvalue-Referenzen in Ordnung ist: std::move und std::forward. Alles andere ist höchstwahrscheinlich ein Fehler / Missbrauch.
Ich weiß jetzt nicht, was handle sein soll. Eventuell kannst Du statt "handle" auch einfach std::unique_ptr benutzen.
-
Danke für deine Antwort; ich bin eben gerade ein Anfänger, was Rvalue References betrifft, und überlege mir, wo ich sie einsetzen sollte und wo nicht.
Beim
handlehandelt es sich um eine Artshared_ptr, welcher sobald er irgendwo konstruiert wird, seine eigene Adresse an zentraler Stelle in einemsetabspeichert. Dadurch stehen mir zur Laufzeit diverse Funktionen zur Verfügung, welche für das Projekt zwingend Voraussetzung sind. Jedesmal, wenn einhandlekopiert wird, muss dieses zwingend wieder registriert werden. Umgekehrt wird jedeshandlebeim Destruktoraufruf wieder abgemeldet.In A Brief Introduction to Rvalue References steht nun folgendes:
Howard E. Hinnant, Bjarne Stroustrup, and Bronek Kozicki schrieb:
Rvalue references allow programmers to avoid logically unnecessary copying and to provide perfect forwarding functions. They are primarily meant to aid in the design of higher performance and more robust libraries.
Betrachtet man den Aufruf
get_enumerator, so steht dieser eigentlich für eine Methode folgender Art:inline handle<enumerator<...> > enumerable_type<...>::get_enumerator() const { return new (..., ...) type_enumerator<..., ...>(..., ...); // Genauer Inhalt ist hier unwichtig. }Es wird also einfach ein Objekt mit
newerzeugt. Dann wird implizit einhandleerzeugt, kopiert, zerstört und dann die Kopie zurückgegeben. Und nachdem der Rückgabewert gespeichert worden ist, wird die Kopie ebenfalls zerstört.Es scheint gerade nicht zu funktionieren...
-
Und wo willst Du jetzt Rvalue-Referenzen einsetzen?
-
/rant/ schrieb:
Das ist übrigens veraltet. Man hat Ende 2008 bzw Anfang 2009 die Rvalue-Referenz-Regeln etwas abgeändert. Beispielsweise soll dies hier
A a; A&& a_ref2 = a;nicht mehr kompilieren. Das direkte Binden einer Rvalue-Referenz an ein Objekt, auf das sich im Initialisierer ein Lvalue-Ausdruck bezieht, ist nicht mehr erlaubt.
Eine der wenigen Artikel-Serien über Rvalue-Referenzen, welche auf dem aktuellen Stand ist, ist diese hier.
kk