Abzug von Vorlagenargumenten mit std::forward deaktivieren
Warum ist der Abzug von Vorlagenargumenten mit std::forward deaktiviert?
Die std::forward-Funktion in bestimmten Implementierungen (z. B. VS2010) verwendet eine Template-Metafunktion namens Identity, um die Ableitung von Template-Argumenten zu verhindern. Dies geschieht, um eine genaue Kontrolle über das Verhalten von std::forward in Situationen zu behalten, in denen L-Wert-Referenzen und konstante L-Wert-Referenzen beteiligt sind.
Auswirkungen der Verwendung der Template-Argument-Ableitung
If Wenn std::forward die Template-Argument-Ableitung nutzen würde, würde dies dazu führen, dass der Template-Parameter (T) basierend auf dem Typ des Eingabearguments abgeleitet wird. Dieses Verhalten wird problematisch, wenn das Eingabeargument ein L-Wert oder ein konstanter L-Wert ist (z. B. Variablen mit Namen). In solchen Fällen würde die Ableitung von Vorlagenargumenten T fälschlicherweise als L-Wert-Referenz oder konstante L-Wert-Referenz ableiten, was zu einer falschen Typumwandlung führen würde.
Betrachten Sie das folgende Beispiel:
<code class="cpp">template<typename T> T&& forward_with_deduction(T&& obj) { return static_cast<T&&>(obj); }</code>
Bei der Übergabe benannter Variablen oder Konstanten an „forward_with_deduction“ übergeben würden, würden diese fälschlicherweise als L-Wert-Referenzen oder konstante L-Wert-Referenzen interpretiert, was dazu führen würde, dass T als solches abgeleitet wird. Folglich würde die Operation „static_cast“ den Typ trotz der Erwartung einer universellen Referenz (T&&) auf eine L-Wert-Referenz oder eine konstante L-Wert-Referenz reduzieren.
Beispiel:
<code class="cpp">int x; int&& z = std::move(x); // Incorrectly deduces T to be int& and casts z as int& forward_with_deduction(z); // calls test(int&) instead of test(int&&)</code>
Auflösung in std::forward
Um eine ordnungsgemäße Argumentation sicherzustellen In allen Fällen verwendet std::forward die Identitätsmetafunktion. Identity fungiert als Platzhaltertyp, der verhindert, dass der Compiler den Vorlagenparameter ableitet. Infolgedessen interpretiert std::forward das Eingabeargument immer als universelle Referenz, unabhängig von seinem tatsächlichen Typ.
Durch die Umwandlung des Eingabearguments in eine universelle Referenz ermöglicht std::forward die perfekte Weiterleitung von Objekten. auch wenn es sich um L-Werte oder konstante L-Werte handelt. Dieses Verhalten stellt sicher, dass der Typ des weitergeleiteten Arguments während des gesamten Weiterleitungsprozesses eine universelle Referenz bleibt.
Das obige ist der detaillierte Inhalt vonWarum deaktiviert „std::forward' die Ableitung von Vorlagenargumenten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!