(Credits: Blog von Pranay Kumar)
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.
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.
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.
Die Schreibweise T&& wird als Forwarding Referenz (auch als universelle Referenz) bezeichnet.
Sie kann an alles gebunden werden.
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!
Scott Meyers bietet eine möglicherweise leichter verständlichere Darstellung des Sachverhalts an:
Abbildung 1: std::forward.
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).

