Skip to content

Latest commit

 

History

History
121 lines (69 loc) · 3.96 KB

File metadata and controls

121 lines (69 loc) · 3.96 KB

Perfect Forwarding

Zurück


Quellcode


(Credits: Blog von Pranay Kumar)


Einleitung

Voraussetzung für das „Perfect Forwarding” ist das Vorhandensein eines Funktionstemplates, das im Rumpf weitere unterlagerte Funktionen aufruft:

Werden die Argumente des Funktionstemplate „identisch” – darunter verstehen wir in diesem Kontext: die LValue- oder RValue-Eigenschaft bleibt erhalten – weitergereicht, so sprechen wir von „Perfect Forwarding”.

Zu den Begriffen LValue oder RValue siehe auch RValue Referenzen / LValue Referenzen.


Begrifflichkeiten

const Referenzen

Eine konstante Referenz, gekennzeichnet durch const T&, kann an alles gebunden werden.

Das Originalobjekt kann durch eine solche Referenz niemals verändert werden.

const-Referenzen sollten eigentlich immer dann verwendet werden, wenn man das betroffene Objekt nicht verändern möchte, zum Beispiel zum Schutze des Objekts.

Veränderbare (mutable) Referenzen

Im Gegensatz zu einer konstanten Referenz kann eine veränderbare Referenz (gekennzeichnet durch T&) nicht an eine temporäre Variable / temporäres Objekt gebunden werden.

Verwenden Sie eine veränderbare Referenz nur dann, wenn Sie das Objekt ändern möchten, auf das die Referenz verweist.

Universal Referenzen / Forwarding Referenz

Die Schreibweise T&& wird als Forwarding Referenz (auch als universelle Referenz) bezeichnet.

Universelle Referenzen (Forwarding References) sind spezielle Referenzen, die sowohl RValue- als auch LValue-Referenzen binden können und dabei die „Wertkategorie„ (Value Category) des Arguments exakt beibehalten.

Die Rolle von std::forward<>

Weil jeder benannte Parameter innerhalb einer Funktion technisch als LValue behandelt wird, geht die ursprüngliche Information (ob das Argument ein RValue war) verloren. Hier kommt std::forward<> ins Spiel: Es castet das Argument nur dann in einen RValue zurück, wenn es ursprünglich als RValue übergeben wurde.

Dies ermöglicht das sogenannte Perfect Forwarding (perfektes Weiterleiten).

Achtung:
Verwenden Sie universelle Referenzen nur dann, wenn Sie Variablen/Objekte an unterlagerte Funktionen/Methoden weiterleiten wollen.

Bemerkung:
Man beachte, dass T&& nur dann eine universelle Referenz darstellt, wenn sie in einem Funktionstemplate verwendet wird, in der T ein Templateparameter des umgebenden Funktionstemplates ist.

Die Verwendung der &&-Syntax mit einem expliziten Typ, z.B. std::string&&, bezeichnet eine RValue-Referenz und ist keine universelle Referenz!


Erläuterung einer universellen Referenz nach Scott Meyers

Scott Meyers bietet eine möglicherweise leichter verständlichere Darstellung des Sachverhalts an:

Abbildung 1: std::forward.


Literaturhinweise

Gute Beschreibungen zu diesem Thema befinden sich in

Peter Pohmann, "C++ 17: Praxiswissen zum neuen Standard. Von C++11 bis 17" (siehe das Literaturverzeichnis).

oder

Universal Reference and Perfect forwarding
(abgerufen am 27.12.2024)

oder

Arne Mertz Blog
(abgerufen am 31.05.2020).

oder

Eli Bendersky's website: Perfect forwarding and universal references in C++
(abgerufen am 15.01.2021).

oder auch

C++11: Perfect forwarding
(abgerufen am 14.03.2021).


Zurück