Verwenden von std::forward: Argumente präzise weiterleiten
Bei der Übergabe von Argumenten an Funktionen in C ist es wichtig, die verwendeten Referenzmodifikatoren zu berücksichtigen um die Funktionsparameter zu definieren. Die Verwendung von std::forward bietet Flexibilität bei der Handhabung von Argumentreferenzen.
Vorteile von std::forward
In C 0x wird std::forward explizit verwendet Argumente in eine Funktion verschieben. Dies ist von Vorteil, wenn die Funktion universelle Referenzen (T&&) akzeptiert und Sie den ursprünglichen Referenztyp beibehalten möchten, unabhängig davon, ob es sich um eine L-Wert-Referenz oder eine R-Wert-Referenz handelt.
Verwenden von && in der Parameterdeklaration
Die Verwendung von && in Parameterdeklarationen gibt an, dass nur R-Wert-Referenzen zulässig sind. Dies bedeutet jedoch nicht, dass dies mit && funktioniert. Parameter können nur mit temporären Parametern aufgerufen werden. Im bereitgestellten Beispiel kann foo mit jeder Art von Argument aufgerufen werden, einschließlich L-Werten.
Argumente in Vorlagenfunktionen weiterleiten
Im Kontext von Vorlagenfunktionen ist dies unerlässlich um std::forward zu verwenden, wenn Argumente an eine andere Funktion innerhalb der Vorlage übergeben werden. Dadurch wird sichergestellt, dass der richtige Argumenttyp an die verschachtelte Funktion weitergeleitet wird, unabhängig davon, ob es sich um einen L-Wert oder einen R-Wert handelt. Zum Beispiel:
template
void doSomething(Params... args) {
doSomethingElse(args...);
}
Dies wird nicht wie beabsichtigt funktionieren, da doSomethingElse kein && hat. Parameter. Stattdessen sollte der folgende Code verwendet werden:
template
void doSomething(Params&&... args) {
doSomethingElse(std::forward(args)...);
}
Mehrfache Weiterleitung von Argumenten
Es ist im Allgemeinen nicht ratsam, ein Argument mehrmals in derselben Funktion weiterzuleiten. std::forward konvertiert einen L-Wert in eine R-Wert-Referenz, und eine erneute Weiterleitung würde zu einer weiteren Konvertierung führen, die zu einer Speicherungültigmachung führen könnte. Beispielsweise sollte der folgende Code nicht verwendet werden:
template
void doSomething(Params&&... args) {
doSomethingElse(std::forward(args)...);
doSomethingWeird(std::forward(args)...);
}
Zusammenfassend lässt sich sagen, dass std::forward eine entscheidende Rolle bei der Gewährleistung einer präzisen Argumentweiterleitung in C spielt. Es hilft dabei, den beabsichtigten Referenztyp beizubehalten und ermöglicht eine nahtlose Zusammenarbeit zwischen Funktionen mit unterschiedlichen Referenzqualifizierern, insbesondere in Vorlagenkontexten.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3